From acc3307ec24740b679f282f82e8dbf5fc5019262 Mon Sep 17 00:00:00 2001 From: tsteven4 Date: Wed, 27 Jun 2018 15:36:08 -0600 Subject: [PATCH] Create a filter base class and make all our filters derived classes of this base class. (#190) --- GPSBabel.pro | 6 +- Makefile.in | 992 ++++++++++++++++++++----------------- arcdist.cc | 86 +--- arcdist.h | 94 ++++ bend.cc | 63 +-- bend.h | 76 +++ defs.h | 136 ++++- discard.cc | 112 +---- discard.h | 129 +++++ duplicate.cc | 63 +-- duplicate.h | 83 ++++ filter.h | 106 ++++ filter_vecs.cc | 272 +++++----- filterdefs.h | 11 +- height.cc | 62 +-- height.h | 234 ++------- heightgrid.h | 214 ++++++++ interpolate.cc | 45 +- interpolate.h | 67 +++ main.cc | 18 +- nukedata.cc | 31 +- nukedata.h | 64 +++ polygon.cc | 56 +-- polygon.h | 67 +++ position.cc | 84 +--- position.h | 80 +++ queue.cc | 177 ------- queue.h | 180 ++++++- radius.cc | 80 +-- radius.h | 95 ++++ reference/swapdata.gpx | 31 ++ reference/swapdata~gpx.gpx | 31 ++ reverse_route.cc | 39 +- reverse_route.h | 46 ++ route.cc | 46 +- smplrout.cc | 112 +---- smplrout.h | 146 ++++++ sort.cc | 57 +-- sort.h | 88 ++++ src/core/datetime.h | 4 + stackfilter.cc | 85 +--- stackfilter.h | 108 ++++ swapdata.cc | 31 +- swapdata.h | 50 ++ testo.d/swap.test | 6 + tools/createGeoidGrid | 2 +- trackfilter.cc | 264 ++-------- trackfilter.h | 231 +++++++++ transform.cc | 96 +--- transform.h | 91 ++++ validate.cc | 50 +- validate.h | 68 +++ waypt.cc | 31 -- 53 files changed, 3256 insertions(+), 2240 deletions(-) create mode 100644 arcdist.h create mode 100644 bend.h create mode 100644 discard.h create mode 100644 duplicate.h create mode 100644 filter.h create mode 100644 heightgrid.h create mode 100644 interpolate.h create mode 100644 nukedata.h create mode 100644 polygon.h create mode 100644 position.h create mode 100644 radius.h create mode 100644 reference/swapdata.gpx create mode 100644 reference/swapdata~gpx.gpx create mode 100644 reverse_route.h create mode 100644 smplrout.h create mode 100644 sort.h create mode 100644 stackfilter.h create mode 100644 swapdata.h create mode 100644 testo.d/swap.test create mode 100644 trackfilter.h create mode 100644 transform.h create mode 100644 validate.h diff --git a/GPSBabel.pro b/GPSBabel.pro index 620d0167a..f6c74520b 100644 --- a/GPSBabel.pro +++ b/GPSBabel.pro @@ -57,6 +57,8 @@ FILTERS=position.cc radius.cc duplicate.cc arcdist.cc polygon.cc smplrout.cc \ reverse_route.cc sort.cc stackfilter.cc trackfilter.cc discard.cc \ nukedata.cc interpolate.cc transform.cc height.cc swapdata.cc bend.cc \ validate.cc +FILTER_HEADERS = $$FILTERS +FILTER_HEADERS ~= s/\.cc/.h/g SHAPE=shapelib/shpopen.c shapelib/dbfopen.c shapelib/safileio.c @@ -102,7 +104,7 @@ HEADERS = \ gbser_private.h \ gbversion.h \ grtcirc.h \ - height.h \ + heightgrid.h \ holux.h \ inifile.h \ jeeps/garminusb.h \ @@ -151,6 +153,8 @@ HEADERS = \ src/core/xmlstreamwriter.h \ src/core/xmltag.h +HEADERS += $$FILTER_HEADERS + INCLUDEPATH += zlib load(configure) diff --git a/Makefile.in b/Makefile.in index ec6d095a3..e7e8d59de 100644 --- a/Makefile.in +++ b/Makefile.in @@ -441,609 +441,693 @@ toolinfo: -$(QMAKE) -v # Machine generated from here down. -alan.o: alan.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h -an1.o: an1.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h an1sym.h +alan.o: alan.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h +an1.o: an1.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h an1sym.h arcdist.o: arcdist.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ - grtcirc.h -bcr.o: bcr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h csv_util.h \ - garmin_tables.h cet_util.h -bend.o: bend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h filterdefs.h grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + arcdist.h filter.h filterdefs.h grtcirc.h +bcr.o: bcr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_tables.h +bend.o: bend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h bend.h filter.h \ + filterdefs.h grtcirc.h brauniger_iq.o: brauniger_iq.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - gbser.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h gbser.h bushnell.o: bushnell.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h bushnell_trl.o: bushnell_trl.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h -cet.o: cet.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h +cet.o: cet.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.o: cet_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - cet/ansi_x3_4_1968.h cet/cp1252.h cet/iso_8859_8.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h src/core/logging.h cet/ansi_x3_4_1968.h cet/cp1252.h \ + cet/iso_8859_8.h compegps.o: compegps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - csv_util.h jeeps/gpsmath.h jeeps/gpsport.h -cst.o: cst.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h strptime.h -csv_util.o: csv_util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - grtcirc.h src/core/logging.h strptime.h xcsv_tokens.gperf + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h jeeps/gpsmath.h jeeps/gpsport.h +cst.o: cst.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h +csv_util.o: csv_util.cc csv_util.h queue.h defs.h config.h zlib/zlib.h \ + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h grtcirc.h \ + jeeps/gpsmath.h src/core/logging.h strptime.h xcsv_tokens.gperf delgpl.o: delgpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h destinator.o: destinator.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - strptime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h strptime.h dg-100.o: dg-100.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h discard.o: discard.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + discard.h filter.h filterdefs.h dmtlog.o: dmtlog.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h xmlgeneric.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h duplicate.o: duplicate.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - filterdefs.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h duplicate.h filter.h filterdefs.h easygps.o: easygps.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h energympro.o: energympro.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h enigma.o: enigma.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h -exif.o: exif.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ - jeeps/gpsmath.h jeeps/gpsport.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +exif.o: exif.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h explorist_ini.o: explorist_ini.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - explorist_ini.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h explorist_ini.h f90g_track.o: f90g_track.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h fatal.o: fatal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h filter_vecs.o: filter_vecs.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - filterdefs.h gbversion.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h arcdist.h filter.h filterdefs.h grtcirc.h bend.h \ + discard.h duplicate.h height.h interpolate.h nukedata.h polygon.h \ + position.h radius.h reverse_route.h smplrout.h sort.h stackfilter.h \ + swapdata.h trackfilter.h strptime.h xmlgeneric.h transform.h validate.h \ + gbversion.h formspec.o: formspec.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h g7towin.o: g7towin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ - cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - garmin_tables.h strptime.h -garmin.o: garmin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - grtcirc.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/gpsserial.h garmin_tables.h garmin_fs.h garmin_device_xml.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h \ + jeeps/gpsmath.h strptime.h +garmin.o: garmin.cc cet_util.h config.h cet.h defs.h queue.h zlib/zlib.h \ + zlib/zconf.h config.h gbfile.h inifile.h session.h src/core/datetime.h \ + garmin_device_xml.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h \ + grtcirc.h jeeps/gpsserial.h garmin_device_xml.o: garmin_device_xml.cc defs.h config.h queue.h \ - zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h xmlgeneric.h garmin_device_xml.h + zlib/zlib.h zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h garmin_device_xml.h xmlgeneric.h garmin_fit.o: garmin_fit.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h garmin_fs.o: garmin_fs.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - cet_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - garmin_tables.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h garmin_gpi.o: garmin_gpi.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - cet_util.h jeeps/gpsmath.h jeeps/gpsport.h garmin_fs.h jeeps/gps.h \ - jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ - jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - garmin_gpi.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_gpi.h \ + jeeps/gpsmath.h garmin_tables.o: garmin_tables.cc garmin_tables.h defs.h config.h queue.h \ - zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h src/core/logging.h jeeps/gpsmath.h jeeps/gpsport.h + zlib/zlib.h zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsmath.h jeeps/gpsport.h src/core/logging.h garmin_txt.o: garmin_txt.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h \ - jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ - jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ - jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ - jeeps/gpsproj.h garmin_tables.h grtcirc.h strptime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h csv_util.h garmin_fs.h jeeps/gps.h \ + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + garmin_tables.h grtcirc.h jeeps/gpsmath.h strptime.h garmin_xt.o: garmin_xt.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h gbfile.o: gbfile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - src/core/logging.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/logging.h gbser.o: gbser.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ - gbser_private.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + gbser_private.h gbser_posix.o: gbser_posix.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - gbser.h gbser_private.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h gbser.h gbser_private.h gbsleep.o: gbsleep.cc config.h -gdb.o: gdb.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ - garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - garmin_tables.h grtcirc.h -geo.o: geo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h src/core/file.h +gdb.o: gdb.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h grtcirc.h \ + jeeps/gpsmath.h +geo.o: geo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h src/core/file.h \ + defs.h +geojson.o: geojson.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/file.h defs.h ggv_bin.o: ggv_bin.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h ggv_log.o: ggv_log.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h \ - jeeps/gpsmath.h jeeps/gpsport.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h ggv_ovl.o: ggv_ovl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h grtcirc.h globals.o: globals.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h gbversion.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + gbversion.h globalsat_sport.o: globalsat_sport.cc defs.h config.h queue.h zlib/zlib.h \ zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ src/core/datetime.h gbser.h glogbook.o: glogbook.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ - src/core/file.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/file.h defs.h xmlgeneric.h gnav_trl.o: gnav_trl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h googledir.o: googledir.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - xmlgeneric.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h gopal.o: gopal.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h grtcirc.h jeeps/gpsmath.h jeeps/gpsport.h \ + strptime.h gpssim.o: gpssim.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h gpsutil.o: gpsutil.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - magellan.h -gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h garmin_fs.h \ - jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h \ - src/core/logging.h src/core/file.h src/core/xmlstreamwriter.h \ - src/core/xmltag.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h magellan.h +gpx.o: gpx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h src/core/file.h defs.h \ + src/core/logging.h src/core/xmlstreamwriter.h src/core/xmltag.h grtcirc.o: grtcirc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h -gtm.o: gtm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +gtm.o: gtm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h gtrnctr.o: gtrnctr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h height.o: height.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ - height.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h height.h heightgrid.h hiketech.o: hiketech.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ - src/core/xmlstreamwriter.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + src/core/xmlstreamwriter.h xmlgeneric.h holux.o: holux.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h holux.h -html.o: html.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h src/core/xmltag.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h holux.h +html.o: html.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h humminbird.o: humminbird.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h -igc.o: igc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h +igc.o: igc.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h ignrando.o: ignrando.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h -igo8.o: igo8.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h -ik3d.o: ik3d.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h +igo8.o: igo8.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h +ik3d.o: ik3d.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h inifile.o: inifile.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h internal_styles.o: internal_styles.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h interpolate.o: interpolate.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - filterdefs.h grtcirc.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h filterdefs.h filter.h grtcirc.h interpolate.h itracku.o: itracku.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h -jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/garminusb.h \ - jeeps/gpsusbint.h jeeps/gpsserial.h -jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h +jeeps/gpsapp.o: jeeps/gpsapp.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsserial.h jeeps/gpsusbint.h +jeeps/gpscom.o: jeeps/gpscom.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsdevice.o: jeeps/gpsdevice.cc jeeps/gps.h jeeps/../defs.h \ - config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ - session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/gpsserial.h + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h jeeps/gpsdevice_ser.o: jeeps/gpsdevice_ser.cc jeeps/gps.h jeeps/../defs.h \ - config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ - session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/gpsserial.h + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h jeeps/gpsdevice_usb.o: jeeps/gpsdevice_usb.cc jeeps/gps.h jeeps/../defs.h \ - config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ - session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/garminusb.h jeeps/gpsusbint.h jeeps/gpsusbcommon.h -jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h mac/libusb/usb.h \ - jeeps/gps.h jeeps/../defs.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h jeeps/gpsport.h \ - jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ - jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ - jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ - jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h \ - jeeps/../garmin_device_xml.h -jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsdatum.h -jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h -jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h -jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h -jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h -jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsserial.h + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h jeeps/gpsusbint.h +jeeps/gpslibusb.o: jeeps/gpslibusb.cc config.h jeeps/gps.h \ + jeeps/../defs.h jeeps/../config.h jeeps/../queue.h zlib/zlib.h \ + zlib/zconf.h jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h \ + jeeps/../inifile.h jeeps/../session.h jeeps/../src/core/datetime.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/gpsinput.h jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h \ + jeeps/../garmin_device_xml.h +jeeps/gpsmath.o: jeeps/gpsmath.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsdatum.h +jeeps/gpsmem.o: jeeps/gpsmem.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h +jeeps/gpsprot.o: jeeps/gpsprot.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h +jeeps/gpsread.o: jeeps/gpsread.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h +jeeps/gpsrqst.o: jeeps/gpsrqst.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h +jeeps/gpssend.o: jeeps/gpssend.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsserial.h jeeps/gpsserial.o: jeeps/gpsserial.cc jeeps/gps.h jeeps/../defs.h \ - config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ - session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/gpsserial.h jeeps/../gbser.h gbser_posix.h + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/../gbser.h jeeps/gpsserial.h gbser_posix.h jeeps/gpsusbcommon.o: jeeps/gpsusbcommon.cc jeeps/gps.h jeeps/../defs.h \ - config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ - session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/garminusb.h jeeps/gpsusbcommon.h -jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/gps.h jeeps/../defs.h \ - config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ - session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/garminusb.h jeeps/gpsusbint.h + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbcommon.h +jeeps/gpsusbread.o: jeeps/gpsusbread.cc jeeps/garminusb.h \ + jeeps/gpsdevice.h jeeps/gps.h jeeps/../defs.h jeeps/../config.h \ + jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h jeeps/../gbfile.h \ + jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h jeeps/../session.h \ + jeeps/../src/core/datetime.h jeeps/gpsport.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsusbint.h jeeps/gpsusbsend.o: jeeps/gpsusbsend.cc jeeps/gps.h jeeps/../defs.h \ - config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h \ - session.h src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/garminusb.h jeeps/gpsusbint.h -jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h config.h \ - queue.h zlib/zlib.h zlib/zconf.h gbfile.h cet.h inifile.h session.h \ - src/core/datetime.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/garminusb.h jeeps/gpsusbint.h +jeeps/jgpsutil.o: jeeps/jgpsutil.cc jeeps/gps.h jeeps/../defs.h \ + jeeps/../config.h jeeps/../queue.h zlib/zlib.h zlib/zconf.h config.h \ + jeeps/../gbfile.h jeeps/../defs.h jeeps/../cet.h jeeps/../inifile.h \ + jeeps/../session.h jeeps/../src/core/datetime.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ + jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ + jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jogmap.o: jogmap.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ - jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h -jtr.o: jtr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h csv_util.h -kml.o: kml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h grtcirc.h \ - src/core/file.h src/core/xmlstreamwriter.h src/core/xmltag.h -lmx.o: lmx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h xmlgeneric.h +jtr.o: jtr.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h +kml.o: kml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h \ + src/core/file.h defs.h src/core/xmlstreamwriter.h src/core/xmltag.h \ + xmlgeneric.h +lmx.o: lmx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h lowranceusr.o: lowranceusr.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h lowranceusr4.o: lowranceusr4.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h -mac/libusb/darwin.o: mac/libusb/darwin.c config.h mac/libusb/usbi.h \ - mac/libusb/usb.h mac/libusb/error.h -mac/libusb/descriptors.o: mac/libusb/descriptors.c mac/libusb/usbi.h \ - mac/libusb/usb.h mac/libusb/error.h -mac/libusb/error.o: mac/libusb/error.c mac/libusb/usb.h \ - mac/libusb/error.h -mac/libusb/usb.o: mac/libusb/usb.c mac/libusb/usbi.h mac/libusb/usb.h \ - mac/libusb/error.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h maggeo.o: maggeo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ - xmlgeneric.h magellan.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h magellan.h xmlgeneric.h magproto.o: magproto.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h magellan.h \ - gbser.h explorist_ini.h -main.o: main.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h filterdefs.h cet_util.h \ - csv_util.h src/core/usasciicodec.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + explorist_ini.h gbser.h magellan.h +main.o: main.cc cet.h cet_util.h config.h defs.h queue.h zlib/zlib.h \ + zlib/zconf.h config.h gbfile.h inifile.h session.h src/core/datetime.h \ + csv_util.h filterdefs.h filter.h src/core/file.h defs.h \ + src/core/usasciicodec.h mapasia.o: mapasia.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h mapbar_track.o: mapbar_track.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h mapfactor.o: mapfactor.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - src/core/file.h src/core/xmlstreamwriter.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h src/core/file.h defs.h src/core/xmlstreamwriter.h mapsend.o: mapsend.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h mapsend.h \ - magellan.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + magellan.h mapsend.h mapsource.o: mapsource.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h garmin_tables.h jeeps/gpsmath.h jeeps/gpsport.h mkshort.o: mkshort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h -mmo.o: mmo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h +mmo.o: mmo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h mtk_locus.o: mtk_locus.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - gbser.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h gbser.h mtk_logger.o: mtk_logger.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - gbser.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h gbser.h mynav.o: mynav.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h navicache.o: navicache.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - cet_util.h src/core/file.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h src/core/file.h defs.h naviguide.o: naviguide.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - csv_util.h jeeps/gpsmath.h jeeps/gpsport.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h csv_util.h jeeps/gpsmath.h jeeps/gpsport.h navilink.o: navilink.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ - jeeps/gpsmath.h jeeps/gpsport.h navilink.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + jeeps/gpsmath.h jeeps/gpsport.h navilink.h navitel.o: navitel.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h netstumbler.o: netstumbler.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - cet_util.h csv_util.h -nmea.o: nmea.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h gbser.h \ - strptime.h jeeps/gpsmath.h jeeps/gpsport.h -nmn4.o: nmn4.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h csv_util.h +nmea.o: nmea.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + gbser.h jeeps/gpsmath.h jeeps/gpsport.h src/core/logging.h strptime.h +nmn4.o: nmn4.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h nukedata.o: nukedata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h -osm.o: osm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h -ozi.o: ozi.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ - jeeps/gpsmath.h jeeps/gpsport.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h nukedata.h +osm.o: osm.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h +ozi.o: ozi.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h jeeps/gpsmath.h jeeps/gpsport.h parse.o: parse.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h strptime.h -pcx.o: pcx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ - cet_util.h csv_util.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + jeeps/gpsmath.h jeeps/gpsport.h +pcx.o: pcx.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ + csv_util.h garmin_tables.h pocketfms_bc.o: pocketfms_bc.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h pocketfms_fp.o: pocketfms_fp.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - xmlgeneric.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h xmlgeneric.h pocketfms_wp.o: pocketfms_wp.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - csv_util.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h csv_util.h polygon.o: polygon.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h polygon.h position.o: position.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ - grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h grtcirc.h position.h psitrex.o: psitrex.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + garmin_tables.h queue.o: queue.cc queue.h radius.o: radius.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ - grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h grtcirc.h radius.h random.o: random.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_fs.h \ - jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsmath.h raymarine.o: raymarine.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - cet_util.h csv_util.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h csv_util.h reverse_route.o: reverse_route.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - filterdefs.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h filterdefs.h filter.h reverse_route.h rgbcolors.o: rgbcolors.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h route.o: route.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + grtcirc.h saroute.o: saroute.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h -sbn.o: sbn.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h navilink.h -sbp.o: sbp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h navilink.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + grtcirc.h +sbn.o: sbn.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h navilink.h +sbp.o: sbp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h navilink.h session.o: session.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h shape.o: shape.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - shapelib/shapefil.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + shapelib/shapefil.h shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h shapelib/safileio.o: shapelib/safileio.c shapelib/shapefil.h shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h skyforce.o: skyforce.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h skytraq.o: skytraq.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h smplrout.o: smplrout.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ - grtcirc.h -sort.o: sort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h filterdefs.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h grtcirc.h smplrout.h +sort.o: sort.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h \ + filter.h sort.h src/core/usasciicodec.o: src/core/usasciicodec.cc src/core/usasciicodec.h src/core/xmlstreamwriter.o: src/core/xmlstreamwriter.cc \ - src/core/xmlstreamwriter.h + src/core/xmlstreamwriter.h +src/core/ziparchive.o: src/core/ziparchive.cc src/core/ziparchive.h \ + defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h gbfile.h \ + defs.h cet.h inifile.h session.h src/core/datetime.h \ + zlib/contrib/minizip/zip.h zlib/contrib/minizip/ioapi.h \ + src/core/logging.h stackfilter.o: stackfilter.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - filterdefs.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h filterdefs.h filter.h stackfilter.h stmsdf.o: stmsdf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - csv_util.h strptime.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h jeeps/gpsmath.h jeeps/gpsport.h grtcirc.h stmwpp.o: stmwpp.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ - cet_util.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + csv_util.h cet_util.h strptime.o: strptime.c config.h strptime.h subrip.o: subrip.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h swapdata.o: swapdata.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h swapdata.h tef_xml.o: tef_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h teletype.o: teletype.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h -text.o: text.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h src/core/xmltag.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +text.o: text.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h tiger.o: tiger.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - csv_util.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h tmpro.o: tmpro.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - csv_util.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h tomtom.o: tomtom.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h -tpg.o: tpg.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h -tpo.o: tpo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +tpg.o: tpg.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +tpo.o: tpo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h trackfilter.o: trackfilter.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - filterdefs.h grtcirc.h strptime.h xmlgeneric.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h filterdefs.h filter.h grtcirc.h strptime.h \ + trackfilter.h xmlgeneric.h transform.o: transform.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - filterdefs.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h filterdefs.h filter.h transform.h unicsv.o: unicsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - csv_util.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - garmin_tables.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h csv_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ + jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h \ + jeeps/gpsmath.h src/core/logging.h units.o: units.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h -util.o: util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h src/core/xmltag.h \ - jeeps/gpsmath.h jeeps/gpsport.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +util.o: util.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h src/core/xmltag.h util_crc.o: util_crc.cc -v900.o: v900.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h +v900.o: v900.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h validate.o: validate.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h filterdefs.h -vcf.o: vcf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ - jeeps/gpsport.h -vecs.o: vecs.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h csv_util.h gbversion.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + filterdefs.h filter.h validate.h +vcf.o: vcf.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h jeeps/gpsmath.h \ + jeeps/gpsport.h +vecs.o: vecs.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h csv_util.h \ + gbversion.h vidaone.o: vidaone.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h vitosmt.o: vitosmt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + grtcirc.h vitovtt.o: vitovtt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h -vpl.o: vpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h +vpl.o: vpl.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h waypt.o: waypt.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - grtcirc.h garmin_fs.h jeeps/gps.h jeeps/gpsport.h jeeps/gpsdevice.h \ - jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ - jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - src/core/logging.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h garmin_fs.h jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h \ + jeeps/gpsdevice.h jeeps/gps.h jeeps/gpssend.h jeeps/gpsread.h \ + jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ + jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h jeeps/gpsrqst.h \ + jeeps/gpsinput.h jeeps/gpsproj.h grtcirc.h src/core/logging.h wbt-200.o: wbt-200.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ - grtcirc.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h gbser.h \ + grtcirc.h wfff_xml.o: wfff_xml.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h wintec_tes.o: wintec_tes.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h -xcsv.o: xcsv.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h cet_util.h csv_util.h \ - jeeps/gpsmath.h jeeps/gpsport.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h +xcsv.o: xcsv.cc csv_util.h queue.h defs.h config.h zlib/zlib.h \ + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h jeeps/gpsmath.h jeeps/gpsport.h src/core/file.h \ + defs.h src/core/logging.h xhtmlent.o: xhtmlent.cc xmlgeneric.o: xmlgeneric.cc defs.h config.h queue.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ - xmlgeneric.h cet_util.h src/core/file.h + zlib/zconf.h config.h gbfile.h cet.h inifile.h session.h \ + src/core/datetime.h cet_util.h src/core/file.h defs.h xmlgeneric.h xmltag.o: xmltag.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h cet_util.h \ - src/core/xmltag.h -xol.o: xol.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h gbfile.h \ - cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h \ - jeeps/gpsmath.h jeeps/gpsport.h garmin_tables.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + cet_util.h src/core/xmltag.h +xol.o: xol.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h config.h \ + gbfile.h cet.h inifile.h session.h src/core/datetime.h garmin_tables.h \ + jeeps/gpsmath.h jeeps/gpsport.h src/core/file.h defs.h \ + src/core/xmlstreamwriter.h xmlgeneric.h yahoo.o: yahoo.cc defs.h config.h queue.h zlib/zlib.h zlib/zconf.h \ - gbfile.h cet.h inifile.h session.h src/core/datetime.h xmlgeneric.h + config.h gbfile.h cet.h inifile.h session.h src/core/datetime.h \ + xmlgeneric.h zlib/adler32.o: zlib/adler32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ - config.h + config.h zlib/compress.o: zlib/compress.c zlib/zlib.h zlib/zconf.h config.h +zlib/contrib/minizip/ioapi.o: zlib/contrib/minizip/ioapi.c \ + zlib/contrib/minizip/ioapi.h zlib/zlib.h zlib/zconf.h config.h +zlib/contrib/minizip/zip.o: zlib/contrib/minizip/zip.c zlib/zlib.h \ + zlib/zconf.h config.h zlib/contrib/minizip/zip.h \ + zlib/contrib/minizip/ioapi.h zlib/contrib/minizip/crypt.h zlib/crc32.o: zlib/crc32.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ - zlib/crc32.h + zlib/crc32.h zlib/deflate.o: zlib/deflate.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ - zlib/zconf.h config.h + zlib/zconf.h config.h zlib/gzclose.o: zlib/gzclose.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ - config.h + config.h zlib/gzlib.o: zlib/gzlib.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ - config.h + config.h zlib/gzread.o: zlib/gzread.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ - config.h + config.h zlib/gzwrite.o: zlib/gzwrite.c zlib/gzguts.h zlib/zlib.h zlib/zconf.h \ - config.h + config.h zlib/infback.o: zlib/infback.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ - config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h + config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h zlib/inffast.o: zlib/inffast.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ - config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h + config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inflate.o: zlib/inflate.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ - config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h + config.h zlib/inftrees.h zlib/inflate.h zlib/inffast.h zlib/inffixed.h zlib/inftrees.o: zlib/inftrees.c zlib/zutil.h zlib/zlib.h zlib/zconf.h \ - config.h zlib/inftrees.h + config.h zlib/inftrees.h zlib/trees.o: zlib/trees.c zlib/deflate.h zlib/zutil.h zlib/zlib.h \ - zlib/zconf.h config.h zlib/trees.h + zlib/zconf.h config.h zlib/trees.h zlib/uncompr.o: zlib/uncompr.c zlib/zlib.h zlib/zconf.h config.h zlib/zutil.o: zlib/zutil.c zlib/zutil.h zlib/zlib.h zlib/zconf.h config.h \ - zlib/gzguts.h + zlib/gzguts.h internal_styles.cc: mkstyle.sh $(srcdir)/style/*.style $(srcdir)/mkstyle.sh > internal_styles.cc || (rm -f internal_styles.cc ; exit 1) diff --git a/arcdist.cc b/arcdist.cc index 3b52e3bc1..1b95c0688 100644 --- a/arcdist.cc +++ b/arcdist.cc @@ -21,6 +21,7 @@ #include "defs.h" +#include "arcdist.h" #include "filterdefs.h" #include "grtcirc.h" @@ -31,59 +32,9 @@ #if FILTERS_ENABLED #define MYNAME "Arc filter" -static double pos_dist; -static char* distopt = nullptr; -static char* arcfileopt = nullptr; -static char* rteopt = nullptr; -static char* trkopt = nullptr; -static char* exclopt = nullptr; -static char* ptsopt = nullptr; -static char* projectopt = nullptr; - -typedef struct { - double distance; - double prjlatitude, prjlongitude; - double frac; - Waypoint* arcpt1, * arcpt2; -} extra_data; - -static -arglist_t arcdist_args[] = { - { - "file", &arcfileopt, "File containing vertices of arc", - nullptr, ARGTYPE_FILE, ARG_NOMINMAX, nullptr - }, - { - "rte", &rteopt, "Route(s) are vertices of arc", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "trk", &trkopt, "Track(s) are vertices of arc", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "distance", &distopt, "Maximum distance from arc", - nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr - }, - { - "exclude", &exclopt, "Exclude points close to the arc", nullptr, - ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "points", &ptsopt, "Use distance from vertices not lines", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "project", &projectopt, "Move waypoints to its projection on lines or vertices", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - #define BADVAL 999999 -static void -arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) +void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) { queue* elem, * tmp; Waypoint* waypointp; @@ -96,7 +47,7 @@ arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) (ptsopt || (arcpt1 && (arcpt1->latitude != BADVAL && arcpt1->longitude != BADVAL)))) { #if NEWQ - foreach(Waypoint* waypointp, waypt_list) { + foreach (Waypoint* waypointp, waypt_list) { #else QUEUE_FOR_EACH(&waypt_head, elem, tmp) { waypointp = (Waypoint*) elem; @@ -146,16 +97,17 @@ arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) arcpt1 = (Waypoint*) arcpt2; } -static void -arcdist_arc_disp_hdr_cb(const route_head*) +void ArcDistanceFilter::arcdist_arc_disp_hdr_cb(const route_head*) { /* Set arcpt1 to NULL */ arcdist_arc_disp_wpt_cb(nullptr); } -static void -arcdist_process() +void ArcDistanceFilter::process() { + WayptFunctor arcdist_arc_disp_wpt_cb_f(this, &ArcDistanceFilter::arcdist_arc_disp_wpt_cb); + RteHdFunctor arcdist_arc_disp_hdr_cb_f(this, &ArcDistanceFilter::arcdist_arc_disp_hdr_cb); + queue* elem, * tmp; unsigned removed; @@ -203,14 +155,14 @@ arcdist_process() gbfclose(file_in); } else if (rteopt) { - route_disp_all(arcdist_arc_disp_hdr_cb, nullptr, arcdist_arc_disp_wpt_cb); + route_disp_all(arcdist_arc_disp_hdr_cb_f, nullptr, arcdist_arc_disp_wpt_cb_f); } else if (trkopt) { - track_disp_all(arcdist_arc_disp_hdr_cb, nullptr, arcdist_arc_disp_wpt_cb); + track_disp_all(arcdist_arc_disp_hdr_cb_f, nullptr, arcdist_arc_disp_wpt_cb_f); } removed = 0; #if NEWQ - foreach(Waypoint* wp, waypt_list) { + foreach (Waypoint* wp, waypt_list) { #else QUEUE_FOR_EACH(&waypt_head, elem, tmp) { Waypoint* wp = (Waypoint*) elem; @@ -267,8 +219,7 @@ arcdist_process() } } -static void -arcdist_init(const char*) +void ArcDistanceFilter::init() { char* fm; @@ -290,17 +241,4 @@ arcdist_init(const char*) } } -static void -arcdist_deinit() -{ - /* do nothing */ -} - -filter_vecs_t arcdist_vecs = { - arcdist_init, - arcdist_process, - arcdist_deinit, - nullptr, - arcdist_args -}; #endif // FILTERS_ENABLED diff --git a/arcdist.h b/arcdist.h new file mode 100644 index 000000000..66f4c4dce --- /dev/null +++ b/arcdist.h @@ -0,0 +1,94 @@ +/* + Distance from point to arc filter + + Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef ARCDIST_H_INCLUDED_ +#define ARCDIST_H_INCLUDED_ + +#include "defs.h" // for ARG_NOMINMAX, ARGTYPE_BOOL, Waypoint (ptr only) +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class ArcDistanceFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + +private: + double pos_dist; + char* distopt = nullptr; + char* arcfileopt = nullptr; + char* rteopt = nullptr; + char* trkopt = nullptr; + char* exclopt = nullptr; + char* ptsopt = nullptr; + char* projectopt = nullptr; + + typedef struct { + double distance; + double prjlatitude, prjlongitude; + double frac; + Waypoint* arcpt1, * arcpt2; + } extra_data; + + arglist_t args[8] = { + { + "file", &arcfileopt, "File containing vertices of arc", + nullptr, ARGTYPE_FILE, ARG_NOMINMAX, nullptr + }, + { + "rte", &rteopt, "Route(s) are vertices of arc", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "trk", &trkopt, "Track(s) are vertices of arc", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "distance", &distopt, "Maximum distance from arc", + nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr + }, + { + "exclude", &exclopt, "Exclude points close to the arc", nullptr, + ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "points", &ptsopt, "Use distance from vertices not lines", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "project", &projectopt, "Move waypoints to its projection on lines or vertices", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + void arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2); + void arcdist_arc_disp_hdr_cb(const route_head*); + +}; +#endif // FILTERS_ENABLED +#endif // ARCDIST_H_INCLUDED_ diff --git a/bend.cc b/bend.cc index 9800b123f..b40c752dc 100644 --- a/bend.cc +++ b/bend.cc @@ -21,6 +21,7 @@ */ #include "defs.h" +#include "bend.h" #include "filterdefs.h" #include "grtcirc.h" @@ -31,30 +32,7 @@ #if FILTERS_ENABLED -static char* distopt = nullptr; -static char* minangleopt = nullptr; - -static double maxDist; -static double minAngle; - -static queue* routes_orig = nullptr; -static int routes_orig_num = 0; - -static -arglist_t bend_args[] = { - { - "distance", &distopt, "Distance to the bend in meters where the new points will be added", - "25", ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr - }, - { - "minangle", &minangleopt, "Minimum bend angle in degrees", "5", - ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -static void -bend_init(const char*) +void BendFilter::init() { maxDist = 0.0; if (distopt) { @@ -70,9 +48,8 @@ bend_init(const char*) route_flush_all_routes(); } -static Waypoint* -create_wpt_dest(const Waypoint* wpt_orig, double lat_orig, - double long_orig, double lat_orig_adj, double long_orig_adj) +Waypoint* BendFilter::create_wpt_dest(const Waypoint* wpt_orig, double lat_orig, + double long_orig, double lat_orig_adj, double long_orig_adj) { double distance = gcdist(lat_orig, long_orig, lat_orig_adj, long_orig_adj); @@ -97,10 +74,9 @@ create_wpt_dest(const Waypoint* wpt_orig, double lat_orig, return wpt_dest; } -static int -is_small_angle(double lat_orig, double long_orig, double lat_orig_prev, - double long_orig_prev, double lat_orig_next, - double long_orig_next) +int BendFilter::is_small_angle(double lat_orig, double long_orig, double lat_orig_prev, + double long_orig_prev, double lat_orig_next, + double long_orig_next) { double heading_prev = heading_true_degrees(lat_orig, long_orig, lat_orig_prev, long_orig_prev); @@ -114,8 +90,7 @@ is_small_angle(double lat_orig, double long_orig, double lat_orig_prev, || (std::abs(heading_diff - 360.0) < minAngle)); } -static void -process_route(const route_head* route_orig, route_head* route_dest) +void BendFilter::process_route(const route_head* route_orig, route_head* route_dest) { Waypoint* wpt_orig_prev = nullptr; Waypoint* wpt_orig = nullptr; @@ -171,8 +146,7 @@ process_route(const route_head* route_orig, route_head* route_dest) } } -static void -process_route_orig(const route_head* route_orig) +void BendFilter::process_route_orig(const route_head* route_orig) { route_head* route_dest = route_head_alloc(); route_dest->rte_name = route_orig->rte_name; @@ -185,8 +159,7 @@ process_route_orig(const route_head* route_orig) process_route(route_orig, route_dest); } -static void -bend_process() +void BendFilter::process() { queue* elem, *tmp; QUEUE_FOR_EACH(routes_orig, elem, tmp) { @@ -195,24 +168,10 @@ bend_process() } } -static void -bend_deinit() +void BendFilter::deinit() { route_flush(routes_orig); xfree(routes_orig); } -static void -bend_exit() -{ -} - -filter_vecs_t bend_vecs = { - bend_init, - bend_process, - bend_deinit, - bend_exit, - bend_args -}; - #endif // FILTERS_ENABLED diff --git a/bend.h b/bend.h new file mode 100644 index 000000000..242d0f78d --- /dev/null +++ b/bend.h @@ -0,0 +1,76 @@ +/* + Add route points before and after a bend. + + Copyright (C) 2011 Fernando Arbeiza, fernando.arbeiza@gmail.com + Copyright (C) 2011 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef BEND_H_INCLUDED_ +#define BEND_H_INCLUDED_ + +#include "defs.h" // for route_head (ptr only), ARGTYPE_FLOAT, ARG_NOMINMAX +#include "filter.h" // for Filter +#include "queue.h" // for queue + +#if FILTERS_ENABLED + +class BendFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + void deinit() override; + +private: + char* distopt = nullptr; + char* minangleopt = nullptr; + + double maxDist; + double minAngle; + + queue* routes_orig = nullptr; + int routes_orig_num = 0; + + arglist_t args[3] = { + { + "distance", &distopt, "Distance to the bend in meters where the new points will be added", + "25", ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr + }, + { + "minangle", &minangleopt, "Minimum bend angle in degrees", "5", + ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + Waypoint* create_wpt_dest(const Waypoint* wpt_orig, double lat_orig, + double long_orig, double lat_orig_adj, double long_orig_adj); + int is_small_angle(double lat_orig, double long_orig, double lat_orig_prev, + double long_orig_prev, double lat_orig_next, + double long_orig_next); + void process_route(const route_head* route_orig, route_head* route_dest); + void process_route_orig(const route_head* route_orig); + +}; + +#endif // FILTERS_ENABLED +#endif // BEND_H_INCLUDED_ diff --git a/defs.h b/defs.h index deb8011ef..1261d9d3c 100644 --- a/defs.h +++ b/defs.h @@ -568,8 +568,8 @@ unsigned int waypt_count(void); void set_waypt_count(unsigned int nc); void waypt_disp(const Waypoint* wpt); void waypt_status_disp(int total_ct, int myct); -void waypt_disp_all(waypt_cb); -void waypt_disp_session(const session_t* se, waypt_cb cb); +//void waypt_disp_all(waypt_cb); /* template */ +//void waypt_disp_session(const session_t* se, waypt_cb cb); /* template */ void waypt_init_bounds(bounds* bounds); int waypt_bounds_valid(bounds* bounds); void waypt_add_to_bounds(bounds* bounds, const Waypoint* waypointp); @@ -595,6 +595,40 @@ double waypt_vertical_speed(const Waypoint* A, const Waypoint* B); double waypt_gradient(const Waypoint* A, const Waypoint* B); double waypt_course(const Waypoint* A, const Waypoint* B); +template +void +waypt_disp_session(const session_t* se, T cb) +{ + extern queue waypt_head; + int i = 0; +#if NEWQ + foreach (Waypoint* waypointp, waypt_list) { +#else + queue* elem, *tmp; + Waypoint* waypointp; + QUEUE_FOR_EACH(&waypt_head, elem, tmp) { + waypointp = (Waypoint*) elem; +#endif + if ((se == nullptr) || (waypointp->session == se)) { + if (global_opts.verbose_status) { + i++; + waypt_status_disp(waypt_count(), i); + } + cb(waypointp); + } + } + if (global_opts.verbose_status) { + fprintf(stdout, "\r\n"); + } +} + +template +void +waypt_disp_all(T cb) +{ + waypt_disp_session(nullptr, cb); +} + /* * Structure of recomputed track/roue data. */ @@ -657,9 +691,10 @@ void track_add_wpt(route_head* rte, Waypoint* wpt); Waypoint* route_find_waypt_by_name(route_head* rh, const char* name); void route_del_wpt(route_head* rte, Waypoint* wpt); void track_del_wpt(route_head* rte, Waypoint* wpt); -void route_disp(const route_head* rte, waypt_cb); -void route_disp_all(route_hdr, route_trl, waypt_cb); -void track_disp_all(route_hdr, route_trl, waypt_cb); +//void route_disp(const route_head* rte, waypt_cb); /* template */ +void route_disp(const route_head* rte, std::nullptr_t /* waypt_cb */); /* override to catch nullptr */ +//void route_disp_all(route_hdr, route_trl, waypt_cb); /* template */ +//void track_disp_all(route_hdr, route_trl, waypt_cb); /* template */ void route_reverse(const route_head* rte_hd); void route_disp_session(const session_t* se, route_hdr rh, route_trl rt, waypt_cb wc); void track_disp_session(const session_t* se, route_hdr rh, route_trl rt, waypt_cb wc); @@ -676,6 +711,97 @@ void track_backup(signed int* count, queue** head_bak); void track_restore(queue* head_bak); void track_recompute(const route_head* trk, computed_trkdata**); +template +void +route_disp(const route_head* rh, T cb) +{ + queue* elem, *tmp; +// cb != nullptr, caught with an overload of route_disp + QUEUE_FOR_EACH(&rh->waypoint_list, elem, tmp) { + Waypoint* waypointp; + waypointp = (Waypoint*) elem; + cb(waypointp); + } +} + +template +void +common_disp_all(queue* qh, T1 rh, T2 rt, T3 wc) +{ + queue* elem, *tmp; + QUEUE_FOR_EACH(qh, elem, tmp) { + const route_head* rhp; + rhp = (route_head*) elem; +// rh != nullptr, caught with an overload of common_disp_all + rh(rhp); + route_disp(rhp, wc); +// rt != nullptr, caught with an overload of common_disp_all + rt(rhp); + } +} + +template +void +common_disp_all(queue* qh, std::nullptr_t /* rh */, T2 rt, T3 wc) +{ + queue* elem, *tmp; + QUEUE_FOR_EACH(qh, elem, tmp) { + const route_head* rhp; + rhp = (route_head*) elem; +// rh == nullptr + route_disp(rhp, wc); +// rt != nullptr, caught with an overload of common_disp_all + rt(rhp); + } +} + +template +void +common_disp_all(queue* qh, T1 rh, std::nullptr_t /* rt */, T3 wc) +{ + queue* elem, *tmp; + QUEUE_FOR_EACH(qh, elem, tmp) { + const route_head* rhp; + rhp = (route_head*) elem; +// rh != nullptr, caught with an overload of common_disp_all + rh(rhp); + route_disp(rhp, wc); +// rt == nullptr + } +} + +template +void +common_disp_all(queue* qh, std::nullptr_t /* rh */, std::nullptr_t /* rt */, T3 wc) +{ + queue* elem, *tmp; + QUEUE_FOR_EACH(qh, elem, tmp) { + const route_head* rhp; + rhp = (route_head*) elem; +// rh == nullptr + route_disp(rhp, wc); +// rt == nullptr + } +} + +template +void +route_disp_all(T1 rh, T2 rt, T3 wc) +{ + extern queue my_route_head; + + common_disp_all(&my_route_head, rh, rt, wc); +} + +template +void +track_disp_all(T1 rh, T2 rt, T3 wc) +{ + extern queue my_track_head; + + common_disp_all(&my_track_head, rh, rt, wc); +} + typedef struct { volatile int request_terminate; } posn_status; diff --git a/discard.cc b/discard.cc index 2e1894700..e5b5de10a 100644 --- a/discard.cc +++ b/discard.cc @@ -20,101 +20,20 @@ */ #include "defs.h" +#include "discard.h" #include "filterdefs.h" #include -// Can't use QRegularExpression because Linux won't get Qt 5 for years. +// Can't use QRegularExpression because Linux won't get Qt 5 for years. #include #include #include #if FILTERS_ENABLED -static char* hdopopt = nullptr; -static char* vdopopt = nullptr; -static char* andopt = nullptr; -static char* satopt = nullptr; -static char* fixnoneopt = nullptr; -static char* fixunknownopt = nullptr; -static char* eleminopt = nullptr; -static char* elemaxopt = nullptr; -static char* nameopt = nullptr; -static QRegExp name_regex; -static char* descopt = nullptr; -static QRegExp desc_regex; -static char* cmtopt = nullptr; -static QRegExp cmt_regex; -static char* iconopt = nullptr; -static QRegExp icon_regex; - -static double hdopf; -static double vdopf; -static int satpf; -static int eleminpf; -static int elemaxpf; -static gpsdata_type what; -static route_head* head; - -static -arglist_t fix_args[] = { - { - "hdop", &hdopopt, "Suppress points with higher hdop", - "-1.0", ARGTYPE_BEGIN_REQ | ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr - }, - { - "vdop", &vdopopt, "Suppress points with higher vdop", - "-1.0", ARGTYPE_END_REQ | ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr - }, - { - "hdopandvdop", &andopt, "Link hdop and vdop supression with AND", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "sat", &satopt, "Minimium sats to keep points", - "-1.0", ARGTYPE_BEGIN_REQ | ARGTYPE_INT, ARG_NOMINMAX, nullptr - }, - { - "fixnone", &fixnoneopt, "Suppress points without fix", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "fixunknown", &fixunknownopt, "Suppress points with unknown fix", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "elemin", &eleminopt, "Suppress points below given elevation in meters", - nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_INT, ARG_NOMINMAX, nullptr - }, - { - "elemax", &elemaxopt, "Suppress points above given elevation in meters", - nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_INT, ARG_NOMINMAX, nullptr - }, - { - "matchname", &nameopt, - "Suppress points where name matches given name", nullptr, ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - { - "matchdesc", &descopt, - "Suppress points where description matches given name", nullptr, ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - { - "matchcmt", &cmtopt, - "Suppress points where comment matches given name", nullptr, ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - { - "matchicon", &iconopt, - "Suppress points where type matches given name", nullptr, ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; /* * Decide whether to keep or toss this point. */ -static void -fix_process_wpt(const Waypoint* wpt) +void DiscardFilter::fix_process_wpt(const Waypoint* wpt) { int del = 0; int delh = 0; @@ -186,31 +105,31 @@ fix_process_wpt(const Waypoint* wpt) } } -static void -fix_process_head(const route_head* trk) +void DiscardFilter::fix_process_head(const route_head* trk) { head = (route_head*)trk; } -static void -fix_process() +void DiscardFilter::process() { + WayptFunctor fix_process_wpt_f(this, &DiscardFilter::fix_process_wpt); + RteHdFunctor fix_process_head_f(this, &DiscardFilter::fix_process_head); + // Filter waypoints. what = wptdata; - waypt_disp_all(fix_process_wpt); + waypt_disp_all(fix_process_wpt_f); // Filter tracks what = trkdata; - track_disp_all(fix_process_head, nullptr, fix_process_wpt); + track_disp_all(fix_process_head_f, nullptr, fix_process_wpt_f); // And routes what = rtedata; - route_disp_all(fix_process_head, nullptr, fix_process_wpt); + route_disp_all(fix_process_head_f, nullptr, fix_process_wpt_f); } -static void -fix_init(const char*) +void DiscardFilter::init() { if (hdopopt) { hdopf = atof(hdopopt); @@ -260,11 +179,4 @@ fix_init(const char*) } } -filter_vecs_t discard_vecs = { - fix_init, - fix_process, - nullptr, - nullptr, - fix_args -}; #endif diff --git a/discard.h b/discard.h new file mode 100644 index 000000000..d31d46ea9 --- /dev/null +++ b/discard.h @@ -0,0 +1,129 @@ +/* + Discard points based on high Degree of Precision (DOP) values. + + Copyright (C) 2005-2014 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef DISCARD_H_INCLUDED_ +#define DISCARD_H_INCLUDED_ + +// Can't use QRegularExpression because Linux won't get Qt 5 for years. +#include // for QRegExp +#include "defs.h" // for ARG_NOMINMAX, ARGTYPE_BEGIN_REQ, ARGTYPE_S... +#include "filter.h" // for Filter + +#if FILTERS_ENABLED +class DiscardFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + +private: + char* hdopopt = nullptr; + char* vdopopt = nullptr; + char* andopt = nullptr; + char* satopt = nullptr; + char* fixnoneopt = nullptr; + char* fixunknownopt = nullptr; + char* eleminopt = nullptr; + char* elemaxopt = nullptr; + char* nameopt = nullptr; + QRegExp name_regex; + char* descopt = nullptr; + QRegExp desc_regex; + char* cmtopt = nullptr; + QRegExp cmt_regex; + char* iconopt = nullptr; + QRegExp icon_regex; + + double hdopf; + double vdopf; + int satpf; + int eleminpf; + int elemaxpf; + gpsdata_type what; + route_head* head; + + arglist_t args[13] = { + { + "hdop", &hdopopt, "Suppress points with higher hdop", + "-1.0", ARGTYPE_BEGIN_REQ | ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr + }, + { + "vdop", &vdopopt, "Suppress points with higher vdop", + "-1.0", ARGTYPE_END_REQ | ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr + }, + { + "hdopandvdop", &andopt, "Link hdop and vdop supression with AND", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "sat", &satopt, "Minimium sats to keep points", + "-1.0", ARGTYPE_BEGIN_REQ | ARGTYPE_INT, ARG_NOMINMAX, nullptr + }, + { + "fixnone", &fixnoneopt, "Suppress points without fix", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "fixunknown", &fixunknownopt, "Suppress points with unknown fix", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "elemin", &eleminopt, "Suppress points below given elevation in meters", + nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_INT, ARG_NOMINMAX, nullptr + }, + { + "elemax", &elemaxopt, "Suppress points above given elevation in meters", + nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_INT, ARG_NOMINMAX, nullptr + }, + { + "matchname", &nameopt, + "Suppress points where name matches given name", nullptr, ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + { + "matchdesc", &descopt, + "Suppress points where description matches given name", nullptr, ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + { + "matchcmt", &cmtopt, + "Suppress points where comment matches given name", nullptr, ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + { + "matchicon", &iconopt, + "Suppress points where type matches given name", nullptr, ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + void fix_process_wpt(const Waypoint* wpt); + void fix_process_head(const route_head* trk); + +}; + +#endif +#endif // DISCARD_H_INCLUDED_ diff --git a/duplicate.cc b/duplicate.cc index afd7d76ba..3fcbd8e40 100644 --- a/duplicate.cc +++ b/duplicate.cc @@ -19,46 +19,14 @@ */ #include "defs.h" +#include "duplicate.h" #include "filterdefs.h" #include #include // qsort #if FILTERS_ENABLED -static char* snopt = nullptr; -static char* lcopt = nullptr; -static char* purge_duplicates = nullptr; -static char* correct_coords = nullptr; - -static -arglist_t dup_args[] = { - { - "shortname", &snopt, "Suppress duplicate waypoints based on name", - nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "location", &lcopt, "Suppress duplicate waypoint based on coords", - nullptr, ARGTYPE_END_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "all", &purge_duplicates, "Suppress all instances of duplicates", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "correct", &correct_coords, "Use coords from duplicate points", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - - -typedef struct btree_node { - struct btree_node* left, *right; - unsigned long data; - Waypoint* wpt; -} btree_node; - -static btree_node* -addnode(btree_node* tree, btree_node* newnode, btree_node** oldnode) + +DuplicateFilter::btree_node* DuplicateFilter::addnode(btree_node* tree, btree_node* newnode, btree_node** oldnode) { btree_node* tmp, * last = nullptr; @@ -95,8 +63,7 @@ addnode(btree_node* tree, btree_node* newnode, btree_node** oldnode) return (tree); } -static void -free_tree(btree_node* tree) +void DuplicateFilter::free_tree(btree_node* tree) { if (tree->left) { free_tree(tree->left); @@ -107,11 +74,6 @@ free_tree(btree_node* tree) xfree(tree); } -typedef struct { - Waypoint* wpt; - int index; -} wpt_ptr; - /* It looks odd that we have different comparisons for date and index. @@ -146,9 +108,7 @@ because, sadly, quicksort can be O(n^2) on presorted elements.) */ -static -int -compare(const void* a, const void* b) +int DuplicateFilter::compare(const void* a, const void* b) { const wpt_ptr* wa = (wpt_ptr*)a; const wpt_ptr* wb = (wpt_ptr*)b; @@ -171,9 +131,7 @@ compare(const void* a, const void* b) } - -static void -duplicate_process(void) +void DuplicateFilter::process(void) { Waypoint* waypointp; btree_node* newnode, * btmp, * sup_tree = nullptr; @@ -195,7 +153,7 @@ duplicate_process(void) i = 0; #if NEWQ - foreach(Waypoint* waypointp, waypt_list) { + foreach (Waypoint* waypointp, waypt_list) { bh->wpt = waypointp; #else QUEUE_FOR_EACH(&waypt_head, elem, tmp) { @@ -271,11 +229,4 @@ duplicate_process(void) } } -filter_vecs_t duplicate_vecs = { - nullptr, - duplicate_process, - nullptr, - nullptr, - dup_args -}; #endif diff --git a/duplicate.h b/duplicate.h new file mode 100644 index 000000000..64a30508a --- /dev/null +++ b/duplicate.h @@ -0,0 +1,83 @@ +/* + exact duplicate point filter utility. + + Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef DUPLICATE_H_INCLUDED_ +#define DUPLICATE_H_INCLUDED_ + +#include "defs.h" // for ARGTYPE_BOOL, ARG_NOMINMAX, Waypoint (ptr only) +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class DuplicateFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void process() override; + +private: + char* snopt = nullptr; + char* lcopt = nullptr; + char* purge_duplicates = nullptr; + char* correct_coords = nullptr; + + arglist_t args[5] = { + { + "shortname", &snopt, "Suppress duplicate waypoints based on name", + nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "location", &lcopt, "Suppress duplicate waypoint based on coords", + nullptr, ARGTYPE_END_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "all", &purge_duplicates, "Suppress all instances of duplicates", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "correct", &correct_coords, "Use coords from duplicate points", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + typedef struct btree_node { + struct btree_node* left, *right; + unsigned long data; + Waypoint* wpt; + } btree_node; + + btree_node* addnode(btree_node* tree, btree_node* newnode, btree_node** oldnode); + void free_tree(btree_node* tree); + + typedef struct { + Waypoint* wpt; + int index; + } wpt_ptr; + + static int compare(const void* a, const void* b); + +}; +#endif +#endif // DUPLICATE_H_INCLUDED_ diff --git a/filter.h b/filter.h new file mode 100644 index 000000000..20c31d591 --- /dev/null +++ b/filter.h @@ -0,0 +1,106 @@ +/* + Filter Base Class + + Copyright (C) 2018 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA +*/ +#ifndef FILTER_H_INCLUDED_ +#define FILTER_H_INCLUDED_ + +#include "defs.h" + +class Filter +{ +public: + virtual arglist_t* get_args() = 0; + + virtual void init() + { + /* Called before filter processing */ + + /* optional. If not needed, delete and replace entry in vecs with NULL */ + + /* This may be used to parse filter options, allocate memory, and do other + * housekeeping that should be done before filtering */ + } + + virtual void process() = 0; /* this procedure must be present in vecs */ +//{ +// Here is how you register callbacks for all waypoints, routes, tracks. +// waypt_disp_all(waypt) +// route_disp_all(head, tail, rtept); +// track_disp_all(head, tail, trkpt); +//} + + virtual void deinit() + { + /* called after filter processing */ + + /* optional. If not needed, delete and replace entry in vecs with NULL */ + + /* This should be used to clean up any memory allocations that are no longer + * needed after the filter terminates. */ + } + + virtual void exit() + { + /* called on program exit */ + + /* optional. If not needed, delete and replace entry in vecs with NULL */ + + /* You should not need this for simple filters, but it may be used to + * clean up memory allocations that must persist from one invocation of + * your filter to the next (for example, the stack in the stack filter.) + * Note that this member will be called even if your filter has not been + * used, so it *cannot* assume that _init or _process has been called + * previously. */ + } + +protected: + template + class RteHdFunctor + { + public: + typedef void (MyFilter::*RteHdCb)(const route_head*); + RteHdFunctor(MyFilter* obj, RteHdCb cb) : that(obj), _cb(cb) {} + void operator()(const route_head* rh) + { + ((that)->*(_cb))(rh); + } + + private: + MyFilter* that; + RteHdCb _cb; + }; + + template + class WayptFunctor + { + public: + typedef void (MyFilter::*WayptCb)(const Waypoint*); + WayptFunctor(MyFilter* obj, WayptCb cb) : that(obj), _cb(cb) {} + void operator()(const Waypoint* wpt) + { + ((that)->*(_cb))(wpt); + } + + private: + MyFilter* that; + WayptCb _cb; + }; + +}; +#endif // FILTER_H_INCLUDED_ diff --git a/filter_vecs.cc b/filter_vecs.cc index 98edd08ae..cc66864fc 100644 --- a/filter_vecs.cc +++ b/filter_vecs.cc @@ -20,7 +20,26 @@ */ #include "defs.h" +#include "arcdist.h" +#include "bend.h" +#include "discard.h" +#include "duplicate.h" #include "filterdefs.h" +#include "filter.h" +#include "height.h" +#include "interpolate.h" +#include "nukedata.h" +#include "polygon.h" +#include "position.h" +#include "radius.h" +#include "reverse_route.h" +#include "smplrout.h" +#include "sort.h" +#include "stackfilter.h" +#include "swapdata.h" +#include "trackfilter.h" +#include "transform.h" +#include "validate.h" #include "gbversion.h" #include "inifile.h" #include @@ -29,127 +48,128 @@ #include // qsort typedef struct { - filter_vecs_t* vec; + Filter* vec; const char* name; const char* desc; } fl_vecs_t; -extern filter_vecs_t bend_vecs; -extern filter_vecs_t position_vecs; -extern filter_vecs_t radius_vecs; -extern filter_vecs_t duplicate_vecs; -extern filter_vecs_t arcdist_vecs; -extern filter_vecs_t polygon_vecs; -extern filter_vecs_t routesimple_vecs; -extern filter_vecs_t reverse_route_vecs; -extern filter_vecs_t sort_vecs; -extern filter_vecs_t stackfilt_vecs; -extern filter_vecs_t trackfilter_vecs; -extern filter_vecs_t discard_vecs; -extern filter_vecs_t nuke_vecs; -extern filter_vecs_t interpolatefilt_vecs; -extern filter_vecs_t transform_vecs; -extern filter_vecs_t height_vecs; -extern filter_vecs_t swapdata_vecs; -extern filter_vecs_t validate_vecs; +ArcDistanceFilter arcdist; +BendFilter bend; +DiscardFilter discard; +DuplicateFilter duplicate; +HeightFilter height; +InterpolateFilter interpolate; +NukeDataFilter nukedata; +PolygonFilter polygon; +PositionFilter position; +RadiusFilter radius; +ReverseRouteFilter reverse_route; +SimplifyRouteFilter routesimple; +SortFilter sort; +StackFilter stackfilt; +SwapDataFilter swapdata; +TrackFilter trackfilter; +TransformFilter transform; +ValidateFilter validate; + static fl_vecs_t filter_vec_list[] = { #if FILTERS_ENABLED + { + &arcdist, + "arc", + "Include Only Points Within Distance of Arc", + }, + { + &bend, + "bend", + "Add points before and after bends in routes" + }, + { + &discard, + "discard", + "Remove unreliable points with high hdop or vdop" + }, + { + &duplicate, + "duplicate", + "Remove Duplicates", + }, + { + &interpolate, + "interpolate", + "Interpolate between trackpoints" + }, + { + &nukedata, + "nuketypes", + "Remove all waypoints, tracks, or routes" + }, + { + &polygon, + "polygon", + "Include Only Points Inside Polygon", + }, + { + &position, + "position", + "Remove Points Within Distance", + }, + { + &radius, + "radius", + "Include Only Points Within Radius", + }, + { + &routesimple, + "simplify", + "Simplify routes", + }, + { + &sort, + "sort", + "Rearrange waypoints by resorting", + }, + { + &stackfilt, + "stack", + "Save and restore waypoint lists" + }, + { + &reverse_route, + "reverse", + "Reverse stops within routes", + }, + { + &trackfilter, + "track", + "Manipulate track lists" + }, + { + &transform, + "transform", + "Transform waypoints into a route, tracks into routes, ..." + }, + { + &height, + "height", + "Manipulate altitudes" + }, + { + &swapdata, + "swap", + "Swap latitude and longitude of all loaded points" + }, { - &arcdist_vecs, - "arc", - "Include Only Points Within Distance of Arc", - }, - { - &bend_vecs, - "bend", - "Add points before and after bends in routes" - }, - { - &discard_vecs, - "discard", - "Remove unreliable points with high hdop or vdop" - }, - { - &duplicate_vecs, - "duplicate", - "Remove Duplicates", - }, - { - &interpolatefilt_vecs, - "interpolate", - "Interpolate between trackpoints" - }, - { - &nuke_vecs, - "nuketypes", - "Remove all waypoints, tracks, or routes" - }, - { - &polygon_vecs, - "polygon", - "Include Only Points Inside Polygon", - }, - { - &position_vecs, - "position", - "Remove Points Within Distance", - }, - { - &radius_vecs, - "radius", - "Include Only Points Within Radius", - }, - { - &routesimple_vecs, - "simplify", - "Simplify routes", - }, - { - &sort_vecs, - "sort", - "Rearrange waypoints by resorting", - }, - { - &stackfilt_vecs, - "stack", - "Save and restore waypoint lists" - }, - { - &reverse_route_vecs, - "reverse", - "Reverse stops within routes", - }, - { - &trackfilter_vecs, - "track", - "Manipulate track lists" - }, - { - &transform_vecs, - "transform", - "Transform waypoints into a route, tracks into routes, ..." - }, - { - &height_vecs, - "height", - "Manipulate altitudes" - }, - { - &swapdata_vecs, - "swap", - "Swap latitude and longitude of all loaded points" - }, - { - &validate_vecs, + &validate, "validate", "Validate internal data structures" }, #elif defined (MINIMAL_FILTERS) { - &trackfilter_vecs, + &trackfilter, "track", "Manipulate track lists" }, @@ -161,7 +181,7 @@ fl_vecs_t filter_vec_list[] = { } }; -filter_vecs_t* +Filter* find_filter_vec(const char* const vecname, const char** opts) { fl_vecs_t* vec = filter_vec_list; @@ -179,8 +199,9 @@ find_filter_vec(const char* const vecname, const char** opts) } /* step 1: initialize by inifile or default values */ - if (vec->vec->args) { - for (ap = vec->vec->args; ap->argstring; ap++) { + struct arglist* args = vec->vec->get_args(); + if (args) { + for (ap = args; ap->argstring; ap++) { const char* temp; temp = inifile_readstr(global_opts.inifile, vec->name, ap->argstring); @@ -199,8 +220,8 @@ find_filter_vec(const char* const vecname, const char** opts) if (res) { *opts = res+1; - if (vec->vec->args) { - for (ap = vec->vec->args; ap->argstring; ap++) { + if (args) { + for (ap = args; ap->argstring; ap++) { char* opt; opt = get_option(*opts, ap->argstring); @@ -219,7 +240,7 @@ find_filter_vec(const char* const vecname, const char** opts) } if (global_opts.debug_level >= 1) { - disp_vec_options(vec->name, vec->vec->args); + disp_vec_options(vec->name, args); } xfree(v); @@ -231,12 +252,13 @@ find_filter_vec(const char* const vecname, const char** opts) } void -free_filter_vec(filter_vecs_t* fvec) +free_filter_vec(Filter* filter) { arglist_t* ap; + struct arglist* args = filter->get_args(); - if (fvec->args) { - for (ap = fvec->args; ap->argstring; ap++) { + if (args) { + for (ap = args; ap->argstring; ap++) { if (ap->argvalptr) { xfree(ap->argvalptr); ap->argvalptr = *ap->argval = nullptr; @@ -251,8 +273,9 @@ init_filter_vecs() fl_vecs_t* vec = filter_vec_list; while (vec->vec) { arglist_t* ap; - if (vec->vec->args) { - for (ap = vec->vec->args; ap->argstring; ap++) { + struct arglist* args = vec->vec->get_args(); + if (args) { + for (ap = args; ap->argstring; ap++) { ap->argvalptr = nullptr; } } @@ -265,9 +288,7 @@ exit_filter_vecs() { fl_vecs_t* vec = filter_vec_list; while (vec->vec) { - if (vec->vec->f_exit) { - (vec->vec->f_exit)(); - } + (vec->vec->exit)(); vec++; } } @@ -285,7 +306,8 @@ disp_filter_vecs() for (vec = filter_vec_list; vec->vec; vec++) { printf(" %-20.20s %-50.50s\n", vec->name, vec->desc); - for (ap = vec->vec->args; ap && ap->argstring; ap++) { + struct arglist* args = vec->vec->get_args(); + for (ap = args; ap && ap->argstring; ap++) { if (!(ap->argtype & ARGTYPE_HIDDEN)) printf(" %-18.18s %-.50s %s\n", ap->argstring, ap->helpstring, @@ -306,7 +328,8 @@ disp_filter_vec(const char* vecname) } printf(" %-20.20s %-50.50s\n", vec->name, vec->desc); - for (ap = vec->vec->args; ap && ap->argstring; ap++) { + struct arglist* args = vec->vec->get_args(); + for (ap = args; ap && ap->argstring; ap++) { if (!(ap->argtype & ARGTYPE_HIDDEN)) printf(" %-18.18s %-.50s %s\n", ap->argstring, ap->helpstring, @@ -321,7 +344,7 @@ alpha(const void* a, const void* b) const fl_vecs_t* const ap = (const fl_vecs_t*) a; const fl_vecs_t* const bp = (const fl_vecs_t*) b; - return case_ignore_strcmp(ap->desc , bp->desc); + return case_ignore_strcmp(ap->desc, bp->desc); } static @@ -340,7 +363,8 @@ disp_v1(const fl_vecs_t* vec) disp_help_url(vec, nullptr); printf("\n"); - for (ap = vec->vec->args; ap && ap->argstring; ap++) { + struct arglist* args = vec->vec->get_args(); + for (ap = args; ap && ap->argstring; ap++) { if (!(ap->argtype & ARGTYPE_HIDDEN)) { printf("option\t%s\t%s\t%s\t%s\t%s\t%s\t%s", vec->name, diff --git a/filterdefs.h b/filterdefs.h index 8b14a165e..6a704b497 100644 --- a/filterdefs.h +++ b/filterdefs.h @@ -26,6 +26,9 @@ * This is our (weak) attempt to make that distinction. */ +#ifndef FILTERDEFS_H_INCLUDED_ +#define FILTERDEFS_H_INCLUDED_ + #if NEWQ #include extern QList waypt_list; @@ -33,8 +36,9 @@ extern QList waypt_list; #include "queue.h" extern queue waypt_head; #endif +#include "filter.h" -typedef void (*filter_init)(char const*); +typedef void (*filter_init)(void); typedef void (*filter_process)(void); typedef void (*filter_deinit)(void); typedef void (*filter_exit)(void); @@ -47,8 +51,8 @@ typedef struct filter_vecs { struct arglist* args; } filter_vecs_t; -filter_vecs_t* find_filter_vec(const char* const, const char**); -void free_filter_vec(filter_vecs_t*); +Filter* find_filter_vec(const char* const, const char**); +void free_filter_vec(Filter*); void disp_filters(int version); void disp_filter(const char* vecname); void disp_filter_vec(const char* vecname); @@ -56,3 +60,4 @@ void disp_filter_vecs(void); void init_filter_vecs(void); void exit_filter_vecs(void); +#endif // FILTERDEFS_H_INCLUDED_ diff --git a/height.cc b/height.cc index 5217b2992..4f3b87c19 100644 --- a/height.cc +++ b/height.cc @@ -24,32 +24,15 @@ #include "defs.h" #include "filterdefs.h" +#include "height.h" #include #include #define MYNAME "height" #if FILTERS_ENABLED -static char* addopt = nullptr; -static char* wgs84tomslopt = nullptr; -static double addf; - - -static -arglist_t height_args[] = { - { - "add", &addopt, "Adds a constant value to every altitude (meter, append \"f\" (x.xxf) for feet)", - nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr - }, - { - "wgs84tomsl", &wgs84tomslopt, "Converts WGS84 ellipsoidal height to orthometric height (MSL)", - nullptr, ARGTYPE_END_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - - -static double bilinear(double x1, double y1, double x2, double y2, double x, double y, double z11, double z12, double z21, double z22) + +double HeightFilter::bilinear(double x1, double y1, double x2, double y2, double x, double y, double z11, double z12, double z21, double z22) { double delta; @@ -68,11 +51,10 @@ static double bilinear(double x1, double y1, double x2, double y2, double x, dou return (z22*(y-y1)*(x-x1)+z12*(y2-y)*(x-x1)+z21*(y-y1)*(x2-x)+z11*(y2-y)*(x2-x))/delta; } - /* return geoid separation (MSL - WGS84) in meters, given a lat/lot in degrees */ -static double wgs84_separation(double lat, double lon) +double HeightFilter::wgs84_separation(double lat, double lon) { -#include "height.h" +#include "heightgrid.h" int ilat, ilon; int ilat1, ilat2, ilon1, ilon2; @@ -103,9 +85,7 @@ static double wgs84_separation(double lat, double lon) ); } - -static void -correct_height(const Waypoint* wpt) +void HeightFilter::correct_height(const Waypoint* wpt) { Waypoint* waypointp = (Waypoint*) wpt; @@ -113,16 +93,14 @@ correct_height(const Waypoint* wpt) if (addopt) { waypointp->altitude += addf; } - + if (wgs84tomslopt) { - waypointp->altitude -= wgs84_separation(waypointp->latitude, waypointp->longitude); + waypointp->altitude -= wgs84_separation(waypointp->latitude, waypointp->longitude); } } } - -static void -height_init(const char*) +void HeightFilter::init() { char* unit; @@ -139,23 +117,13 @@ height_init(const char*) } } - -static void -height_process() /* this procedure must be present in vecs */ +void HeightFilter::process() { - waypt_disp_all(correct_height); - route_disp_all(nullptr, nullptr, correct_height); - track_disp_all(nullptr, nullptr, correct_height); -} - - -filter_vecs_t height_vecs = { - height_init, - height_process, - nullptr, - nullptr, - height_args -}; + WayptFunctor correct_height_f(this, &HeightFilter::correct_height); + waypt_disp_all(correct_height_f); + route_disp_all(nullptr, nullptr, correct_height_f); + track_disp_all(nullptr, nullptr, correct_height_f); +} #endif // FILTERS_ENABLED diff --git a/height.h b/height.h index 56fe5b4b1..1c1b14b8a 100644 --- a/height.h +++ b/height.h @@ -1,5 +1,9 @@ /* - Copyright (C) 2013 Robert Lipe, robertlipe+source@gpsbabel.org + Copyright (C) 2008 Alexander Stapff, a.stapff@gmx.de + + Geoid separation code by Oleg Gusev, from data by Peter Dana. + This code was published by the gpsd project (http://gpsd.berlios.de/) + under the BSD license. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,199 +20,47 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */ + #ifndef HEIGHT_H_INCLUDED_ #define HEIGHT_H_INCLUDED_ -/* Created by "tools/createGeoidGrid 1.0 int8_t" using GeographicLib utility GeoidEval with egm96-5. */ +#include "defs.h" // for ARG_NOMINMAX, Waypoint (ptr only), arglist_t +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class HeightFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; -#include +private: + char* addopt = nullptr; + char* wgs84tomslopt = nullptr; + double addf; + + arglist_t args[3] = { + { + "add", &addopt, "Adds a constant value to every altitude (meter, append \"f\" (x.xxf) for feet)", + nullptr, ARGTYPE_BEGIN_REQ | ARGTYPE_FLOAT, ARG_NOMINMAX, nullptr + }, + { + "wgs84tomsl", &wgs84tomslopt, "Converts WGS84 ellipsoidal height to orthometric height (MSL)", + nullptr, ARGTYPE_END_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + double bilinear(double x1, double y1, double x2, double y2, double x, double y, double z11, double z12, double z21, double z22); + double wgs84_separation(double lat, double lon); + void correct_height(const Waypoint* wpt); -#define GEOID_GRID_DEG 1.0 -#define GEOID_SCALE 1.0 -#define GEOID_ROW 181 -#define GEOID_COL 361 -static const int8_t geoid_delta[GEOID_COL* GEOID_ROW]= { - /* -180,-179,-178,-177,-176,-175,-174,-173,-172,-171,-170,-169,-168,-167,-166,-165,-164,-163,-162,-161,-160,-159,-158,-157,-156,-155,-154,-153,-152,-151,-150,-149,-148,-147,-146,-145,-144,-143,-142,-141,-140,-139,-138,-137,-136,-135,-134,-133,-132,-131,-130,-129,-128,-127,-126,-125,-124,-123,-122,-121,-120,-119,-118,-117,-116,-115,-114,-113,-112,-111,-110,-109,-108,-107,-106,-105,-104,-103,-102,-101,-100, -99, -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -86, -85, -84, -83, -82, -81, -80, -79, -78, -77, -76, -75, -74, -73, -72, -71, -70, -69, -68, -67, -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180 */ - /* -90.0 */ -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - /* -89.0 */ -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - /* -88.0 */ -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -30, - /* -87.0 */ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -26, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -21, -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -20, -20, -20, -20, -20, -20, -20, -20, -20, -21, -21, -21, -21, -21, -21, -22, -22, -22, -22, -22, -22, -22, -22, -22, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -26, -26, -26, -26, -27, -27, -27, -27, -28, -28, -28, -28, -28, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -31, -31, -31, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -32, -32, -32, -32, -32, -32, -32, -32, - /* -86.0 */ -33, -33, -34, -34, -34, -34, -34, -34, -34, -34, -35, -35, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -36, -36, -35, -35, -34, -34, -33, -33, -32, -32, -32, -32, -32, -32, -32, -33, -33, -34, -34, -34, -34, -34, -34, -33, -33, -32, -32, -31, -31, -31, -31, -31, -31, -32, -32, -32, -32, -32, -32, -32, -31, -31, -30, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -27, -27, -26, -26, -25, -24, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -24, -25, -25, -25, -25, -26, -26, -26, -26, -27, -27, -26, -26, -26, -25, -24, -24, -23, -22, -21, -21, -20, -20, -20, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -16, -16, -16, -16, -16, -17, -17, -17, -17, -17, -18, -18, -18, -18, -19, -19, -19, -19, -20, -20, -20, -20, -21, -21, -21, -22, -22, -22, -23, -23, -23, -23, -24, -24, -24, -24, -25, -25, -25, -26, -26, -27, -27, -27, -28, -28, -28, -29, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32, -32, -32, -32, -33, -33, -33, -33, -33, -33, -34, -34, -34, -34, -34, -34, -34, -34, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -34, -34, -34, -34, -33, -33, -33, -33, -33, -33, -33, -33, -33, - /* -85.0 */ -37, -38, -39, -39, -40, -40, -40, -39, -39, -39, -39, -39, -40, -40, -41, -41, -41, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -43, -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -38, -38, -38, -37, -37, -38, -38, -38, -38, -38, -38, -37, -37, -36, -35, -35, -34, -34, -34, -34, -34, -34, -34, -35, -35, -34, -34, -33, -32, -32, -31, -30, -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26, -26, -26, -26, -27, -27, -28, -28, -29, -29, -30, -30, -30, -30, -29, -29, -29, -28, -28, -27, -27, -26, -25, -25, -24, -23, -23, -22, -22, -23, -23, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -24, -25, -25, -25, -25, -25, -25, -25, -24, -23, -22, -21, -19, -18, -18, -17, -17, -17, -18, -18, -18, -19, -19, -19, -19, -18, -18, -18, -17, -17, -17, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -13, -13, -14, -14, -14, -15, -15, -16, -16, -16, -17, -17, -18, -18, -19, -19, -20, -20, -20, -21, -21, -21, -22, -22, -22, -23, -23, -24, -24, -24, -25, -25, -26, -26, -26, -27, -28, -28, -29, -29, -30, -30, -31, -32, -32, -32, -33, -33, -34, -34, -34, -35, -35, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -36, -36, -37, -37, -37, -37, -36, -36, -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -36, -36, -36, -35, -35, -36, -36, -37, -37, -38, -38, -38, -37, -37, -36, -35, -35, -34, -34, -35, -36, -37, - /* -84.0 */ -44, -45, -45, -45, -45, -45, -45, -45, -44, -44, -44, -44, -45, -45, -45, -45, -44, -44, -44, -44, -44, -44, -44, -44, -45, -45, -45, -45, -44, -44, -44, -44, -43, -43, -43, -43, -42, -42, -42, -41, -41, -41, -41, -41, -41, -40, -40, -40, -40, -40, -39, -39, -39, -39, -39, -39, -39, -38, -38, -38, -37, -37, -36, -36, -36, -36, -36, -35, -35, -34, -34, -33, -32, -32, -31, -31, -30, -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -27, -27, -26, -26, -26, -25, -25, -24, -24, -24, -24, -24, -25, -25, -26, -26, -26, -25, -25, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -22, -22, -21, -21, -20, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -19, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -15, -15, -15, -15, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -10, -9, -9, -8, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -7, -7, -7, -7, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -7, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -12, -12, -13, -13, -13, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -19, -19, -20, -20, -21, -22, -22, -22, -23, -23, -24, -24, -25, -26, -26, -27, -28, -28, -29, -30, -30, -31, -32, -33, -33, -34, -35, -35, -35, -36, -36, -36, -36, -37, -37, -37, -37, -37, -37, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -37, -37, -37, -36, -36, -35, -35, -34, -34, -34, -34, -34, -34, -34, -35, -36, -37, -38, -39, -41, -41, -42, -42, -42, -42, -42, -42, -43, -43, -44, - /* -83.0 */ -45, -45, -46, -46, -46, -46, -46, -46, -46, -46, -47, -47, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -45, -45, -44, -44, -44, -44, -44, -44, -44, -43, -43, -43, -43, -42, -42, -42, -42, -42, -42, -42, -41, -41, -41, -41, -41, -40, -40, -40, -39, -39, -38, -38, -38, -37, -37, -36, -36, -35, -35, -34, -33, -32, -32, -31, -31, -30, -30, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -24, -24, -23, -22, -22, -21, -21, -20, -20, -20, -21, -21, -21, -21, -21, -21, -20, -20, -19, -19, -18, -18, -18, -18, -17, -17, -17, -17, -17, -18, -18, -18, -18, -18, -17, -16, -16, -15, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -11, -11, -11, -11, -10, -10, -9, -8, -6, -5, -5, -4, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -4, -4, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -6, -7, -7, -8, -8, -9, -9, -10, -10, -11, -11, -12, -12, -13, -14, -15, -15, -16, -17, -18, -18, -19, -20, -20, -21, -22, -22, -23, -23, -24, -25, -25, -26, -27, -28, -28, -29, -30, -31, -31, -32, -32, -33, -34, -34, -35, -36, -37, -37, -38, -39, -39, -39, -39, -39, -39, -39, -40, -40, -41, -41, -41, -41, -41, -41, -40, -40, -40, -40, -40, -40, -40, -39, -39, -38, -37, -37, -36, -36, -36, -37, -38, -38, -39, -39, -40, -40, -41, -41, -42, -42, -43, -44, -44, -44, -45, -45, -45, -45, -45, -45, - /* -82.0 */ -48, -48, -48, -48, -48, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -48, -48, -48, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -46, -45, -45, -45, -45, -45, -45, -44, -44, -44, -43, -43, -43, -42, -42, -42, -42, -42, -42, -41, -41, -41, -40, -39, -39, -38, -38, -37, -37, -36, -36, -35, -35, -35, -34, -34, -33, -33, -33, -32, -32, -31, -31, -30, -30, -30, -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -28, -28, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -24, -24, -23, -23, -23, -23, -24, -24, -24, -23, -22, -21, -20, -20, -20, -20, -19, -19, -19, -18, -17, -17, -17, -17, -17, -17, -17, -16, -15, -14, -13, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -3, -2, -1, -0, 0, 1, 1, 1, 1, 1, 1, 0, 0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 0, -0, -1, -1, -2, -3, -3, -4, -4, -5, -6, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -16, -17, -18, -19, -19, -20, -21, -21, -22, -23, -24, -25, -26, -26, -27, -28, -29, -30, -31, -31, -32, -33, -33, -34, -35, -36, -37, -38, -39, -40, -41, -41, -40, -40, -41, -41, -42, -43, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -43, -43, -42, -41, -40, -40, -41, -42, -44, -45, -45, -46, -46, -46, -47, -47, -47, -47, -47, -47, -47, -48, -48, -48, -48, -48, -48, -48, - /* -81.0 */ -50, -50, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -49, -49, -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -45, -45, -44, -44, -43, -42, -41, -41, -41, -41, -41, -41, -40, -40, -40, -40, -39, -39, -38, -38, -37, -37, -37, -36, -36, -36, -35, -35, -34, -33, -32, -32, -32, -31, -31, -30, -29, -28, -28, -27, -27, -27, -27, -26, -26, -26, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -25, -25, -25, -25, -24, -24, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -25, -25, -25, -25, -25, -25, -25, -24, -24, -23, -23, -22, -22, -22, -21, -21, -20, -20, -20, -20, -20, -20, -19, -19, -18, -18, -17, -16, -16, -16, -16, -16, -15, -15, -15, -14, -14, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -3, -2, -2, -1, -1, -0, 0, 1, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 4, 3, 2, 2, 1, 1, -0, -1, -1, -1, -2, -3, -4, -5, -6, -8, -9, -10, -11, -11, -13, -14, -15, -15, -16, -17, -18, -19, -20, -21, -21, -22, -24, -25, -26, -27, -28, -29, -30, -30, -31, -32, -33, -33, -34, -35, -36, -37, -38, -39, -39, -40, -40, -40, -41, -41, -42, -43, -44, -45, -46, -46, -47, -47, -47, -47, -47, -47, -48, -48, -48, -48, -48, -49, -49, -50, -49, -48, -47, -45, -45, -46, -47, -48, -50, -50, -50, -50, -49, -49, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - /* -80.0 */ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -52, -52, -53, -53, -53, -53, -53, -53, -53, -52, -52, -52, -52, -52, -53, -53, -52, -52, -52, -51, -51, -51, -51, -50, -50, -49, -49, -49, -48, -48, -48, -47, -47, -47, -46, -46, -45, -44, -42, -42, -41, -41, -41, -41, -41, -40, -40, -40, -39, -39, -38, -38, -38, -38, -38, -38, -38, -38, -38, -37, -36, -35, -34, -33, -33, -32, -31, -30, -29, -28, -27, -26, -26, -25, -25, -24, -23, -23, -22, -22, -23, -23, -23, -22, -22, -22, -22, -23, -24, -25, -25, -25, -24, -24, -23, -23, -23, -23, -23, -22, -22, -21, -21, -21, -21, -21, -20, -20, -20, -21, -21, -21, -22, -22, -22, -22, -22, -21, -21, -20, -19, -18, -17, -17, -17, -17, -18, -18, -18, -18, -18, -17, -17, -17, -17, -18, -19, -19, -18, -17, -16, -15, -15, -15, -15, -15, -15, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 8, 9, 9, 9, 8, 8, 7, 7, 7, 6, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 5, 4, 4, 3, 3, 2, 2, 1, 0, -0, -1, -1, -2, -3, -4, -6, -7, -8, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -27, -28, -29, -30, -30, -31, -32, -33, -34, -35, -36, -37, -38, -39, -39, -40, -40, -40, -41, -42, -42, -43, -44, -44, -45, -46, -47, -48, -49, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -51, -51, -51, -51, -51, -51, -52, -53, -54, -55, -54, -54, -53, -52, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -52, -52, -52, -52, -53, - /* -79.0 */ -54, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -54, -54, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -52, -51, -51, -50, -50, -50, -50, -50, -51, -51, -51, -50, -49, -48, -47, -47, -46, -46, -45, -44, -43, -42, -42, -41, -41, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -36, -36, -36, -36, -35, -35, -34, -34, -34, -34, -33, -32, -31, -31, -30, -29, -28, -27, -26, -26, -25, -23, -22, -21, -20, -19, -18, -16, -15, -17, -20, -23, -25, -25, -24, -23, -23, -23, -23, -23, -23, -22, -22, -22, -21, -20, -20, -20, -20, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -17, -16, -15, -15, -15, -15, -16, -16, -16, -16, -16, -15, -15, -15, -15, -14, -15, -15, -15, -14, -13, -12, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -3, -3, -2, -2, -1, -1, -0, -0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 9, 10, 10, 10, 10, 9, 8, 8, 7, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 3, 3, 2, 2, 1, 0, -0, -1, -2, -2, -3, -3, -5, -7, -8, -10, -11, -12, -12, -13, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -26, -27, -28, -29, -30, -31, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -41, -41, -42, -42, -43, -44, -44, -45, -46, -47, -48, -49, -50, -51, -51, -52, -52, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -52, -52, -53, -54, -56, -57, -57, -56, -55, -54, -53, -53, -53, -52, -52, -53, -53, -53, -52, -52, -53, -53, -54, -54, -54, - /* -78.0 */ -56, -56, -57, -57, -57, -57, -57, -56, -56, -56, -57, -57, -57, -56, -56, -56, -56, -56, -56, -56, -55, -54, -54, -54, -53, -53, -53, -54, -54, -54, -53, -52, -52, -52, -51, -51, -51, -50, -51, -51, -51, -51, -49, -48, -47, -46, -46, -45, -45, -44, -42, -41, -40, -40, -39, -40, -40, -39, -39, -38, -38, -37, -36, -36, -35, -35, -35, -35, -34, -34, -34, -34, -34, -34, -34, -33, -33, -32, -31, -31, -31, -30, -29, -28, -27, -26, -24, -22, -21, -20, -19, -17, -15, -13, -15, -18, -22, -24, -24, -22, -21, -20, -20, -21, -21, -21, -21, -20, -19, -19, -19, -19, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -15, -16, -16, -16, -15, -14, -14, -14, -14, -15, -15, -15, -15, -15, -14, -14, -14, -13, -11, -10, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -7, -6, -6, -6, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -1, -1, -2, -3, -2, -2, -1, -0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 11, 10, 10, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 2, 1, 1, -0, -1, -2, -2, -2, -2, -3, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -17, -18, -20, -22, -22, -22, -22, -23, -24, -25, -26, -27, -29, -30, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -42, -42, -42, -43, -44, -44, -45, -46, -47, -49, -50, -50, -51, -51, -52, -53, -54, -55, -55, -56, -56, -57, -57, -57, -56, -56, -56, -55, -55, -54, -53, -52, -52, -53, -54, -55, -55, -54, -53, -53, -53, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -55, -56, -56, - /* -77.0 */ -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -59, -59, -59, -59, -58, -57, -57, -57, -57, -56, -56, -56, -56, -55, -55, -55, -55, -54, -53, -53, -52, -51, -50, -49, -48, -47, -46, -46, -45, -44, -43, -43, -43, -42, -42, -41, -40, -39, -38, -37, -36, -36, -37, -37, -38, -37, -37, -37, -37, -36, -36, -36, -36, -35, -35, -35, -35, -35, -34, -34, -33, -32, -32, -31, -31, -30, -29, -28, -27, -26, -26, -25, -24, -23, -22, -21, -21, -20, -19, -18, -18, -18, -20, -20, -20, -18, -17, -16, -17, -19, -21, -21, -20, -19, -19, -18, -18, -18, -17, -17, -17, -17, -17, -16, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -10, -9, -7, -5, -5, -4, -3, -3, -2, -2, -2, -1, -1, -1, -2, -1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 9, 9, 10, 10, 10, 9, 8, 7, 7, 6, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 0, 0, -0, -1, -2, -3, -4, -5, -7, -8, -9, -10, -12, -14, -16, -18, -19, -19, -19, -19, -20, -20, -21, -22, -24, -26, -27, -29, -30, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -42, -42, -42, -44, -45, -45, -46, -48, -49, -50, -50, -50, -51, -52, -53, -54, -55, -56, -56, -57, -57, -58, -58, -57, -57, -57, -56, -56, -55, -55, -54, -53, -52, -53, -54, -55, -55, -55, -55, -55, -55, -55, -56, -57, -57, -56, -55, -55, -56, -56, -57, -57, -57, -58, - /* -76.0 */ -60, -60, -60, -60, -60, -60, -59, -59, -59, -59, -59, -59, -59, -59, -59, -60, -61, -62, -62, -62, -63, -63, -63, -63, -63, -63, -61, -60, -58, -57, -56, -55, -54, -54, -53, -52, -50, -49, -48, -47, -45, -44, -43, -43, -42, -41, -41, -40, -41, -41, -40, -38, -37, -36, -36, -36, -36, -36, -37, -37, -37, -36, -36, -36, -36, -35, -33, -32, -32, -32, -32, -32, -31, -30, -30, -29, -28, -28, -27, -27, -26, -26, -25, -25, -24, -23, -23, -22, -22, -22, -21, -20, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -19, -18, -18, -17, -18, -18, -17, -15, -13, -13, -13, -13, -14, -15, -15, -14, -13, -12, -12, -13, -13, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -2, -1, -1, -1, -1, -0, 1, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 12, 13, 13, 13, 14, 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 10, 9, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 4, 4, 3, 0, -2, -4, -5, -5, -6, -7, -8, -9, -10, -12, -13, -15, -16, -17, -18, -18, -19, -20, -21, -23, -24, -26, -28, -29, -30, -32, -33, -35, -35, -36, -37, -37, -38, -39, -40, -41, -41, -41, -42, -43, -45, -46, -47, -49, -50, -50, -50, -50, -51, -52, -53, -54, -55, -56, -56, -57, -57, -58, -58, -58, -58, -57, -57, -56, -56, -57, -57, -56, -55, -54, -55, -57, -58, -58, -58, -57, -57, -57, -57, -58, -58, -58, -58, -57, -58, -58, -58, -59, -59, -60, - /* -75.0 */ -62, -62, -62, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -64, -64, -64, -64, -64, -64, -64, -64, -63, -63, -63, -63, -62, -62, -62, -61, -60, -58, -56, -54, -52, -51, -50, -49, -48, -47, -47, -46, -44, -44, -44, -44, -44, -43, -42, -40, -39, -39, -39, -38, -38, -37, -37, -37, -36, -36, -36, -37, -36, -35, -33, -32, -31, -30, -30, -29, -29, -28, -27, -27, -26, -26, -26, -26, -25, -25, -24, -23, -22, -21, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17, -17, -17, -16, -16, -15, -15, -16, -15, -13, -12, -10, -9, -8, -7, -6, -6, -5, -5, -6, -9, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 3, 4, 5, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 10, 9, 9, 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 16, 16, 15, 15, 15, 16, 16, 16, 15, 14, 15, 16, 16, 16, 16, 16, 16, 16, 15, 15, 16, 17, 17, 16, 15, 15, 15, 14, 14, 14, 13, 12, 12, 12, 13, 13, 13, 12, 11, 10, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 4, 2, -0, -2, -3, -4, -5, -6, -7, -8, -9, -11, -12, -14, -15, -16, -17, -18, -19, -21, -23, -25, -26, -27, -29, -30, -31, -32, -33, -34, -35, -36, -36, -37, -37, -38, -39, -41, -42, -42, -43, -43, -45, -46, -48, -48, -48, -48, -49, -50, -51, -51, -52, -53, -54, -55, -55, -56, -57, -57, -57, -58, -58, -58, -58, -58, -58, -58, -58, -59, -58, -56, -54, -54, -55, -57, -58, -58, -58, -58, -58, -59, -59, -59, -59, -59, -59, -59, -59, -60, -61, -62, - /* -74.0 */ -61, -62, -63, -63, -64, -65, -65, -65, -65, -66, -66, -65, -65, -65, -65, -65, -65, -65, -65, -65, -65, -64, -64, -64, -63, -63, -63, -63, -62, -62, -61, -61, -60, -59, -59, -58, -58, -57, -56, -55, -53, -51, -50, -49, -49, -49, -49, -47, -45, -43, -43, -43, -41, -40, -39, -39, -38, -38, -37, -37, -37, -37, -38, -38, -38, -36, -35, -33, -32, -31, -31, -30, -30, -29, -28, -28, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -19, -19, -18, -18, -18, -17, -16, -16, -16, -16, -17, -16, -16, -14, -13, -13, -13, -12, -11, -10, -8, -7, -6, -6, -5, -3, -2, -1, -1, -1, -2, -4, -6, -7, -7, -7, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -2, -1, -1, -0, -0, -1, -1, -1, -2, -2, -1, -1, -0, 1, 1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 13, 14, 14, 13, 13, 12, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 18, 18, 18, 18, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 20, 19, 18, 18, 18, 19, 19, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 17, 16, 14, 12, 12, 12, 13, 13, 13, 12, 11, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 1, -0, -2, -3, -4, -6, -7, -8, -9, -11, -12, -14, -15, -17, -18, -20, -21, -24, -26, -27, -28, -29, -29, -30, -31, -32, -33, -34, -35, -36, -36, -37, -38, -39, -40, -41, -42, -42, -42, -44, -46, -47, -46, -45, -46, -47, -49, -50, -50, -50, -51, -51, -52, -53, -55, -56, -56, -57, -57, -58, -58, -58, -58, -59, -59, -59, -58, -57, -55, -53, -50, -48, -49, -53, -56, -58, -59, -58, -59, -59, -59, -59, -59, -59, -60, -60, -60, -61, -61, - /* -73.0 */ -61, -61, -62, -63, -64, -64, -65, -65, -66, -66, -66, -66, -66, -65, -65, -65, -65, -65, -65, -65, -64, -64, -64, -64, -63, -63, -63, -62, -62, -61, -61, -60, -60, -59, -58, -58, -57, -57, -56, -55, -55, -54, -53, -52, -52, -51, -50, -50, -49, -47, -46, -45, -44, -42, -40, -40, -40, -39, -38, -38, -37, -36, -36, -35, -35, -35, -34, -34, -33, -33, -32, -32, -31, -31, -29, -28, -27, -26, -25, -25, -24, -23, -22, -22, -22, -21, -21, -21, -20, -18, -18, -18, -18, -17, -17, -17, -16, -16, -15, -15, -14, -13, -12, -11, -10, -9, -8, -7, -5, -3, -2, -1, 0, 1, 2, 3, 3, 2, -1, -3, -4, -4, -4, -5, -4, -3, -3, -2, -2, -2, -2, -1, -1, -1, -2, -2, -2, -3, -3, -4, -4, -4, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -1, 0, 1, 2, 3, 4, 6, 7, 7, 7, 7, 8, 8, 8, 9, 11, 13, 15, 15, 14, 13, 12, 13, 13, 14, 15, 16, 17, 18, 18, 19, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 19, 19, 20, 23, 23, 22, 21, 21, 21, 20, 21, 22, 22, 22, 21, 22, 22, 23, 23, 24, 23, 22, 22, 21, 21, 21, 22, 22, 21, 21, 20, 20, 19, 19, 19, 19, 19, 19, 20, 21, 21, 20, 20, 20, 20, 20, 19, 17, 14, 12, 13, 14, 15, 16, 16, 14, 13, 13, 13, 12, 11, 11, 10, 9, 8, 7, 6, 5, 5, 4, 3, 2, 0, -0, -1, -3, -5, -7, -8, -9, -11, -13, -15, -17, -18, -20, -22, -24, -27, -28, -29, -28, -29, -30, -31, -31, -32, -33, -33, -34, -35, -36, -37, -38, -39, -40, -40, -38, -39, -41, -43, -43, -43, -43, -45, -46, -48, -50, -49, -49, -49, -50, -51, -52, -53, -54, -55, -56, -57, -57, -57, -58, -58, -58, -59, -58, -58, -56, -55, -54, -52, -51, -51, -52, -55, -58, -58, -57, -57, -58, -58, -58, -58, -59, -60, -61, -61, -61, -61, - /* -72.0 */ -62, -62, -62, -62, -63, -64, -65, -66, -66, -66, -66, -65, -65, -65, -65, -65, -64, -64, -64, -64, -63, -63, -63, -63, -62, -62, -62, -61, -61, -60, -60, -59, -59, -59, -58, -57, -56, -56, -55, -54, -54, -53, -52, -52, -51, -51, -50, -49, -48, -47, -46, -45, -45, -44, -44, -43, -42, -41, -40, -39, -38, -37, -35, -34, -33, -33, -33, -33, -32, -32, -31, -31, -30, -30, -29, -28, -27, -26, -25, -24, -23, -23, -22, -21, -21, -22, -22, -22, -20, -18, -17, -17, -17, -16, -15, -15, -15, -14, -13, -13, -12, -12, -11, -10, -9, -7, -6, -4, -2, -0, 2, 2, 3, 4, 6, 7, 7, 6, 3, 1, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, 0, 1, 2, 4, 6, 7, 8, 8, 8, 9, 10, 10, 10, 12, 14, 14, 13, 13, 13, 12, 12, 13, 13, 14, 16, 17, 18, 17, 17, 16, 15, 16, 15, 15, 16, 16, 16, 17, 18, 17, 17, 18, 19, 20, 21, 23, 23, 21, 20, 21, 22, 22, 22, 22, 23, 25, 26, 26, 26, 26, 26, 25, 25, 24, 22, 21, 22, 23, 24, 24, 24, 24, 23, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 18, 16, 14, 13, 13, 13, 13, 14, 15, 15, 15, 15, 15, 14, 13, 13, 12, 11, 10, 9, 8, 6, 5, 5, 4, 3, 2, 1, -1, -3, -5, -6, -8, -9, -11, -12, -14, -16, -17, -19, -20, -22, -24, -26, -27, -27, -28, -29, -30, -31, -32, -32, -32, -32, -33, -34, -35, -36, -37, -38, -37, -37, -38, -39, -40, -40, -41, -42, -43, -45, -48, -50, -51, -51, -50, -50, -51, -52, -52, -53, -54, -55, -56, -57, -57, -57, -58, -57, -57, -57, -56, -54, -53, -55, -56, -57, -56, -55, -55, -56, -55, -53, -54, -56, -58, -58, -58, -59, -60, -61, -61, -62, -62, - /* -71.0 */ -61, -61, -62, -63, -64, -65, -65, -65, -64, -65, -66, -65, -64, -64, -64, -64, -63, -63, -63, -63, -62, -62, -62, -61, -61, -61, -61, -60, -60, -59, -59, -58, -58, -57, -57, -56, -56, -55, -54, -53, -53, -52, -51, -51, -50, -49, -48, -47, -47, -46, -45, -44, -43, -43, -42, -42, -41, -40, -40, -40, -39, -39, -38, -38, -37, -36, -36, -35, -34, -34, -33, -32, -32, -30, -28, -27, -27, -26, -25, -24, -24, -23, -22, -22, -22, -21, -20, -18, -17, -17, -16, -15, -14, -14, -14, -14, -14, -13, -12, -11, -11, -10, -10, -8, -7, -6, -4, -3, -1, 0, 3, 4, 5, 7, 10, 11, 11, 10, 8, 5, 4, 3, 2, 1, 1, -0, -1, -2, -2, -1, -1, -1, -1, -1, -1, -0, -0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 5, 7, 8, 10, 11, 11, 11, 11, 11, 11, 10, 11, 11, 11, 13, 13, 13, 12, 13, 13, 14, 14, 14, 13, 12, 12, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 18, 20, 22, 22, 22, 22, 21, 20, 20, 21, 22, 22, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 25, 25, 26, 26, 25, 24, 23, 23, 23, 23, 22, 23, 23, 22, 21, 23, 25, 25, 25, 23, 21, 18, 15, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 3, 1, -1, -2, -4, -5, -6, -7, -9, -10, -11, -13, -14, -15, -17, -18, -19, -20, -22, -24, -25, -26, -27, -27, -28, -29, -30, -31, -31, -32, -32, -33, -34, -34, -35, -35, -36, -37, -38, -39, -39, -40, -42, -43, -44, -46, -47, -48, -49, -49, -50, -51, -52, -52, -52, -53, -55, -56, -57, -57, -57, -58, -57, -57, -57, -56, -54, -55, -57, -59, -59, -60, -59, -58, -58, -58, -57, -57, -58, -59, -59, -59, -59, -60, -61, -61, -61, -61, - /* -70.0 */ -62, -62, -63, -64, -64, -64, -64, -64, -63, -63, -63, -63, -63, -63, -62, -62, -62, -62, -62, -62, -61, -61, -61, -60, -60, -60, -60, -59, -58, -58, -57, -57, -56, -56, -55, -55, -54, -54, -53, -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -45, -44, -43, -42, -41, -40, -40, -40, -40, -39, -38, -37, -36, -36, -36, -35, -35, -34, -34, -34, -33, -33, -33, -32, -32, -31, -31, -30, -29, -28, -27, -26, -26, -27, -27, -27, -25, -22, -21, -22, -22, -21, -19, -17, -15, -13, -12, -11, -10, -10, -10, -10, -9, -7, -6, -4, -4, -3, -2, 0, 2, 4, 5, 7, 10, 12, 13, 13, 11, 8, 6, 5, 4, 4, 4, 2, 1, -1, -1, -1, -0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11, 11, 10, 11, 13, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14, 14, 14, 16, 17, 17, 17, 18, 18, 17, 16, 16, 17, 19, 20, 21, 21, 21, 21, 20, 20, 21, 21, 20, 21, 22, 21, 21, 20, 19, 20, 21, 22, 23, 25, 27, 27, 26, 27, 27, 26, 27, 27, 28, 28, 28, 27, 26, 26, 26, 25, 26, 26, 25, 26, 28, 28, 26, 24, 22, 20, 17, 17, 17, 17, 17, 17, 16, 16, 16, 15, 16, 16, 15, 14, 14, 13, 12, 11, 11, 9, 8, 8, 7, 6, 4, 3, 1, -1, -2, -4, -6, -7, -9, -10, -12, -13, -14, -16, -17, -18, -18, -19, -19, -22, -24, -24, -25, -26, -27, -28, -29, -30, -30, -31, -32, -32, -33, -34, -34, -36, -37, -37, -38, -38, -39, -42, -44, -44, -43, -43, -44, -45, -46, -47, -49, -51, -51, -51, -52, -54, -55, -55, -56, -57, -56, -56, -56, -56, -55, -55, -56, -57, -57, -57, -57, -57, -58, -59, -59, -59, -59, -58, -58, -59, -59, -59, -60, -60, -61, -61, -62, - /* -69.0 */ -61, -61, -61, -62, -63, -63, -63, -63, -62, -61, -61, -60, -60, -60, -60, -59, -59, -59, -59, -59, -59, -59, -58, -59, -58, -58, -57, -57, -57, -56, -56, -55, -55, -54, -54, -53, -52, -52, -51, -51, -50, -49, -49, -48, -47, -46, -45, -45, -44, -43, -42, -42, -41, -40, -40, -39, -39, -38, -37, -36, -36, -36, -35, -35, -34, -34, -34, -33, -33, -32, -32, -31, -31, -31, -30, -29, -29, -28, -28, -27, -26, -26, -25, -25, -25, -24, -22, -21, -19, -17, -16, -16, -16, -15, -14, -14, -13, -12, -11, -9, -8, -7, -7, -6, -4, -3, -2, 0, 3, 4, 5, 6, 7, 9, 11, 12, 11, 9, 8, 7, 7, 6, 7, 7, 6, 5, 3, 3, 3, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 9, 9, 9, 9, 10, 11, 10, 10, 11, 11, 12, 13, 13, 14, 14, 14, 15, 16, 15, 15, 16, 16, 16, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 21, 23, 23, 23, 24, 24, 22, 21, 21, 21, 23, 24, 24, 25, 27, 28, 28, 28, 26, 27, 29, 31, 33, 34, 32, 30, 30, 30, 29, 28, 28, 27, 27, 28, 29, 29, 27, 25, 23, 22, 20, 19, 18, 17, 16, 16, 16, 16, 17, 17, 17, 16, 15, 14, 14, 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 5, 2, 0, -2, -5, -6, -8, -10, -11, -13, -15, -16, -17, -18, -18, -19, -19, -20, -22, -23, -24, -25, -26, -26, -27, -28, -29, -30, -30, -31, -32, -33, -35, -36, -37, -37, -37, -37, -37, -40, -43, -43, -42, -42, -43, -44, -44, -46, -47, -48, -50, -51, -51, -52, -53, -53, -54, -54, -53, -53, -53, -53, -54, -55, -55, -55, -56, -57, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -59, -60, -60, -60, -60, -61, -61, - /* -68.0 */ -58, -59, -60, -61, -61, -62, -61, -60, -59, -58, -58, -58, -58, -58, -57, -57, -57, -56, -56, -56, -56, -56, -56, -56, -56, -55, -55, -55, -55, -54, -54, -53, -53, -52, -52, -51, -50, -50, -49, -49, -48, -48, -47, -46, -46, -45, -44, -44, -43, -42, -41, -40, -40, -39, -38, -38, -37, -37, -36, -36, -36, -35, -35, -34, -33, -33, -32, -32, -31, -31, -30, -30, -30, -29, -29, -28, -28, -28, -27, -26, -26, -25, -24, -24, -23, -22, -22, -21, -20, -19, -18, -17, -16, -15, -14, -14, -13, -12, -11, -11, -10, -9, -8, -7, -5, -3, -1, 1, 2, 3, 5, 6, 7, 7, 8, 8, 9, 9, 9, 8, 9, 8, 9, 10, 9, 8, 7, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 16, 15, 14, 15, 15, 15, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 18, 19, 22, 23, 23, 23, 24, 25, 25, 25, 25, 25, 24, 25, 26, 26, 27, 29, 30, 32, 35, 36, 37, 38, 38, 36, 34, 34, 34, 32, 31, 30, 30, 30, 29, 28, 27, 27, 25, 24, 23, 21, 20, 19, 18, 17, 17, 17, 18, 17, 16, 15, 15, 14, 13, 13, 12, 10, 10, 11, 9, 9, 10, 9, 7, 6, 4, 2, 1, -2, -3, -5, -8, -9, -11, -12, -13, -14, -16, -17, -18, -18, -18, -18, -19, -22, -24, -25, -26, -26, -27, -28, -29, -29, -29, -30, -31, -34, -35, -36, -37, -37, -37, -37, -37, -39, -41, -41, -41, -41, -41, -43, -44, -45, -46, -48, -49, -50, -51, -52, -52, -52, -53, -53, -52, -51, -51, -51, -51, -53, -53, -54, -55, -55, -55, -55, -55, -55, -55, -55, -56, -56, -57, -57, -57, -58, -58, -59, -59, -59, -58, - /* -67.0 */ -58, -58, -59, -58, -58, -57, -56, -56, -56, -56, -56, -55, -55, -55, -55, -54, -54, -54, -54, -54, -54, -54, -53, -53, -53, -52, -52, -52, -51, -51, -51, -51, -50, -49, -49, -48, -47, -47, -46, -46, -46, -46, -45, -45, -44, -44, -43, -42, -42, -41, -40, -39, -38, -38, -37, -37, -36, -36, -36, -35, -35, -35, -34, -34, -33, -32, -32, -31, -31, -30, -29, -29, -29, -28, -28, -27, -27, -27, -26, -26, -25, -25, -24, -23, -22, -21, -21, -20, -19, -18, -17, -16, -16, -14, -13, -13, -12, -11, -10, -10, -9, -7, -6, -5, -4, -2, -1, 2, 4, 5, 6, 8, 9, 9, 9, 10, 11, 12, 12, 11, 11, 11, 12, 12, 13, 12, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 13, 13, 13, 14, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 20, 22, 22, 22, 23, 23, 23, 24, 25, 26, 26, 26, 26, 27, 29, 31, 32, 33, 34, 36, 39, 41, 41, 39, 35, 33, 32, 31, 30, 30, 29, 28, 27, 26, 26, 24, 23, 24, 25, 25, 24, 22, 20, 19, 18, 18, 18, 17, 16, 16, 16, 15, 14, 14, 12, 10, 10, 10, 9, 8, 8, 6, 4, 3, 1, -1, -1, -2, -3, -3, -6, -8, -9, -11, -12, -13, -15, -17, -18, -18, -18, -17, -18, -22, -25, -26, -27, -28, -28, -28, -29, -29, -30, -31, -32, -34, -36, -37, -37, -36, -37, -38, -39, -40, -40, -40, -40, -40, -41, -42, -43, -44, -45, -47, -48, -49, -49, -49, -49, -49, -49, -49, -49, -48, -49, -50, -50, -50, -51, -51, -51, -50, -50, -51, -52, -53, -53, -53, -54, -54, -55, -56, -56, -56, -57, -57, -57, -58, -58, - /* -66.0 */ -55, -54, -53, -53, -54, -54, -54, -54, -54, -53, -53, -53, -53, -52, -52, -52, -52, -52, -52, -52, -52, -51, -51, -50, -50, -50, -50, -50, -49, -49, -48, -48, -47, -47, -46, -45, -45, -45, -44, -43, -43, -43, -43, -43, -42, -42, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35, -35, -34, -34, -34, -33, -33, -32, -32, -32, -31, -30, -30, -29, -28, -28, -27, -27, -26, -26, -25, -25, -25, -24, -24, -23, -23, -22, -21, -20, -20, -19, -19, -17, -16, -16, -15, -14, -13, -12, -12, -11, -10, -8, -7, -7, -5, -4, -3, -2, -0, 1, 2, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 15, 15, 14, 14, 15, 16, 16, 14, 13, 13, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15, 15, 15, 15, 15, 15, 16, 16, 17, 17, 18, 19, 18, 18, 18, 17, 17, 17, 18, 18, 18, 17, 17, 18, 18, 18, 19, 19, 20, 19, 19, 22, 23, 23, 23, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 33, 34, 35, 37, 36, 34, 32, 31, 30, 28, 27, 26, 25, 25, 25, 25, 24, 24, 24, 23, 22, 21, 20, 20, 19, 18, 17, 15, 15, 15, 16, 16, 15, 14, 13, 12, 12, 10, 9, 8, 7, 5, 3, 1, 0, -0, -1, -3, -2, -1, -2, -3, -6, -8, -10, -12, -14, -14, -15, -15, -16, -18, -19, -21, -22, -23, -24, -25, -25, -26, -27, -28, -29, -30, -31, -32, -33, -35, -36, -36, -37, -37, -38, -39, -39, -40, -41, -42, -42, -42, -42, -43, -44, -45, -45, -45, -46, -46, -46, -45, -46, -47, -49, -48, -47, -47, -47, -47, -47, -48, -48, -48, -48, -49, -49, -49, -50, -51, -52, -52, -52, -53, -54, -54, -55, -55, -55, -55, -55, -55, - /* -65.0 */ -52, -51, -51, -52, -51, -51, -51, -51, -51, -51, -51, -50, -50, -50, -50, -50, -49, -49, -49, -49, -49, -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -45, -45, -44, -44, -43, -43, -42, -42, -42, -42, -42, -41, -41, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -35, -35, -34, -33, -33, -33, -32, -32, -31, -31, -31, -30, -30, -30, -29, -28, -28, -27, -26, -26, -26, -25, -25, -24, -24, -23, -23, -22, -22, -21, -20, -20, -18, -17, -17, -16, -15, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -2, -1, 0, 1, 2, 4, 5, 6, 8, 11, 13, 14, 15, 15, 16, 18, 18, 18, 18, 18, 18, 19, 19, 16, 15, 15, 14, 13, 13, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 12, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 14, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 19, 19, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 20, 21, 23, 24, 24, 25, 26, 26, 26, 27, 28, 28, 28, 28, 29, 30, 30, 31, 30, 30, 30, 31, 31, 30, 30, 30, 29, 29, 28, 27, 27, 27, 27, 27, 26, 25, 25, 25, 24, 23, 22, 21, 20, 20, 20, 19, 18, 18, 16, 15, 14, 14, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 4, 3, 3, 1, 0, -1, -1, -2, -4, -7, -8, -9, -11, -12, -13, -15, -17, -18, -19, -19, -20, -20, -21, -22, -25, -27, -29, -31, -32, -32, -32, -33, -33, -34, -35, -35, -35, -36, -36, -37, -38, -39, -41, -42, -43, -44, -44, -44, -44, -45, -45, -45, -45, -46, -46, -46, -46, -45, -45, -44, -44, -44, -44, -44, -44, -44, -44, -44, -45, -46, -46, -47, -47, -48, -49, -49, -50, -51, -51, -52, -52, -52, -52, -52, -52, -52, -52, - /* -64.0 */ -51, -51, -50, -50, -50, -50, -50, -49, -49, -49, -48, -48, -48, -48, -47, -47, -47, -47, -47, -46, -46, -45, -45, -45, -45, -45, -44, -43, -43, -43, -43, -42, -42, -42, -42, -41, -41, -40, -40, -40, -40, -39, -39, -39, -39, -39, -38, -38, -37, -37, -36, -36, -35, -35, -34, -33, -33, -32, -32, -31, -31, -31, -30, -30, -29, -29, -29, -28, -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -23, -22, -21, -21, -20, -19, -18, -17, -17, -16, -15, -14, -13, -13, -12, -12, -11, -10, -9, -8, -6, -5, -4, -3, -1, 0, 1, 2, 3, 4, 6, 7, 8, 10, 11, 14, 16, 17, 18, 18, 19, 21, 21, 21, 21, 22, 22, 20, 18, 17, 15, 15, 16, 16, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 13, 13, 14, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 23, 24, 25, 26, 27, 27, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 29, 29, 28, 28, 27, 27, 27, 26, 26, 26, 25, 24, 23, 23, 22, 22, 22, 21, 20, 19, 18, 16, 15, 15, 14, 13, 12, 11, 10, 8, 7, 5, 4, 3, 3, 2, 2, 0, 0, -0, -2, -4, -8, -9, -10, -11, -12, -13, -16, -18, -19, -20, -21, -22, -22, -22, -23, -25, -27, -28, -30, -31, -32, -33, -34, -35, -36, -37, -37, -38, -39, -40, -40, -41, -41, -41, -41, -41, -41, -41, -41, -42, -43, -44, -44, -43, -43, -42, -42, -42, -42, -42, -42, -41, -41, -41, -41, -41, -41, -41, -41, -42, -43, -43, -44, -45, -45, -46, -47, -47, -48, -48, -48, -48, -49, -50, -50, -50, -51, -51, -51, - /* -63.0 */ -50, -50, -49, -49, -49, -49, -48, -48, -47, -47, -47, -46, -46, -45, -45, -45, -44, -44, -44, -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -39, -38, -38, -38, -38, -38, -37, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34, -33, -33, -33, -32, -32, -31, -30, -30, -30, -29, -29, -28, -28, -28, -27, -27, -26, -26, -26, -25, -25, -24, -24, -23, -23, -22, -22, -21, -21, -20, -20, -19, -18, -17, -17, -16, -15, -14, -13, -13, -12, -12, -11, -10, -10, -8, -7, -6, -5, -4, -3, -1, 0, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 14, 15, 15, 17, 19, 21, 22, 23, 24, 24, 23, 22, 22, 21, 20, 20, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 14, 14, 14, 15, 16, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 25, 24, 25, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31, 30, 30, 31, 31, 30, 29, 29, 29, 29, 29, 29, 30, 30, 30, 31, 30, 30, 30, 29, 29, 29, 28, 27, 27, 26, 26, 26, 25, 25, 24, 24, 24, 23, 22, 21, 20, 18, 18, 18, 17, 16, 14, 13, 12, 10, 8, 7, 6, 4, 3, 2, 0, -1, -2, -3, -4, -6, -7, -8, -9, -10, -12, -13, -13, -15, -16, -18, -20, -21, -22, -23, -23, -24, -25, -27, -28, -29, -30, -31, -32, -32, -33, -34, -34, -35, -36, -37, -38, -39, -39, -40, -40, -40, -41, -41, -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -39, -39, -39, -38, -38, -37, -38, -38, -37, -38, -38, -39, -40, -40, -41, -42, -42, -43, -43, -44, -44, -45, -46, -47, -49, -49, -50, -50, -50, -50, -50, -50, - /* -62.0 */ -49, -49, -49, -48, -48, -48, -47, -47, -46, -46, -45, -45, -44, -44, -43, -43, -42, -42, -42, -41, -41, -40, -40, -40, -39, -39, -38, -38, -38, -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31, -30, -30, -30, -29, -29, -28, -27, -27, -27, -26, -26, -26, -26, -25, -25, -25, -24, -24, -23, -23, -22, -22, -21, -21, -21, -20, -19, -19, -18, -17, -16, -16, -15, -15, -14, -13, -12, -12, -11, -10, -10, -9, -8, -7, -6, -5, -3, -2, -1, 1, 2, 3, 4, 6, 7, 8, 10, 12, 13, 14, 15, 15, 14, 14, 15, 18, 21, 22, 22, 22, 23, 23, 22, 21, 20, 20, 20, 20, 21, 22, 23, 22, 22, 21, 19, 19, 19, 20, 20, 20, 20, 19, 20, 19, 20, 19, 19, 19, 19, 18, 18, 18, 17, 16, 16, 16, 15, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 28, 29, 30, 30, 31, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 30, 30, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 29, 28, 28, 28, 28, 27, 27, 26, 26, 25, 25, 24, 23, 22, 22, 22, 21, 21, 20, 19, 17, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -0, -1, -2, -3, -5, -6, -7, -8, -9, -9, -10, -11, -13, -14, -15, -16, -18, -19, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -32, -33, -34, -34, -35, -35, -36, -36, -36, -37, -37, -38, -38, -38, -39, -39, -38, -37, -37, -37, -37, -37, -36, -36, -36, -36, -35, -35, -34, -35, -35, -35, -35, -35, -36, -37, -37, -38, -39, -39, -40, -41, -42, -43, -45, -47, -48, -48, -48, -48, -49, -49, -49, -49, -49, -49, - /* -61.0 */ -48, -47, -47, -47, -47, -46, -46, -45, -45, -45, -44, -43, -43, -43, -42, -42, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -36, -35, -35, -35, -35, -34, -34, -34, -34, -34, -34, -33, -33, -33, -33, -32, -32, -32, -32, -32, -31, -30, -30, -30, -29, -29, -28, -28, -28, -29, -28, -27, -27, -26, -26, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -23, -22, -22, -21, -21, -21, -20, -20, -19, -18, -18, -17, -17, -16, -15, -15, -14, -14, -13, -12, -12, -11, -10, -9, -8, -8, -7, -6, -5, -4, -3, -2, -0, 1, 2, 3, 5, 7, 8, 9, 11, 12, 14, 15, 17, 17, 18, 18, 18, 17, 16, 15, 16, 21, 23, 24, 24, 22, 21, 21, 21, 21, 23, 25, 26, 26, 24, 21, 18, 20, 20, 21, 22, 21, 22, 22, 22, 22, 22, 22, 22, 21, 19, 17, 17, 17, 16, 17, 18, 18, 18, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 27, 28, 28, 28, 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 31, 31, 31, 30, 30, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 21, 19, 17, 14, 12, 11, 9, 8, 6, 5, 3, 2, 1, 0, -1, -2, -4, -5, -6, -7, -8, -8, -9, -10, -11, -13, -14, -15, -16, -17, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -30, -31, -31, -32, -33, -33, -34, -34, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -34, -34, -34, -34, -33, -33, -33, -33, -32, -31, -32, -32, -33, -33, -33, -33, -34, -35, -36, -37, -38, -39, -40, -41, -43, -45, -45, -46, -46, -47, -47, -48, -48, -48, -48, -48, -48, -48, - /* -60.0 */ -46, -46, -46, -45, -45, -45, -44, -44, -44, -43, -43, -43, -42, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -35, -35, -34, -34, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -29, -29, -29, -28, -28, -27, -27, -27, -27, -26, -26, -25, -25, -24, -24, -24, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -22, -21, -21, -20, -20, -20, -19, -18, -18, -17, -16, -16, -15, -14, -14, -14, -13, -12, -12, -11, -10, -9, -9, -8, -7, -7, -6, -5, -4, -4, -2, -1, 0, 1, 2, 4, 6, 7, 8, 9, 12, 13, 15, 16, 17, 17, 18, 18, 19, 20, 21, 21, 20, 20, 20, 21, 21, 21, 20, 20, 19, 18, 19, 17, 16, 16, 18, 20, 21, 22, 21, 20, 21, 22, 23, 23, 23, 24, 24, 24, 23, 22, 18, 13, 10, 13, 18, 20, 20, 21, 21, 21, 21, 20, 19, 18, 18, 18, 17, 17, 16, 16, 16, 16, 15, 15, 15, 16, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 28, 28, 29, 29, 29, 29, 29, 30, 31, 32, 32, 32, 33, 33, 34, 34, 34, 35, 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 33, 33, 33, 32, 32, 31, 31, 31, 31, 31, 31, 30, 29, 29, 28, 27, 27, 27, 28, 27, 26, 26, 25, 25, 24, 22, 21, 17, 14, 12, 11, 10, 9, 8, 7, 5, 4, 3, 2, 0, -1, -2, -3, -4, -5, -7, -7, -8, -9, -10, -11, -12, -14, -15, -16, -17, -18, -20, -21, -22, -23, -24, -25, -26, -26, -27, -28, -28, -29, -30, -30, -31, -31, -32, -32, -33, -33, -33, -33, -33, -33, -33, -33, -33, -32, -32, -31, -31, -31, -30, -30, -30, -30, -29, -29, -30, -31, -31, -31, -31, -31, -33, -35, -36, -37, -38, -39, -40, -41, -42, -43, -44, -44, -45, -46, -46, -46, -47, -47, -47, -47, -46, -46, - /* -59.0 */ -45, -44, -44, -44, -44, -43, -43, -43, -42, -42, -41, -41, -41, -40, -39, -39, -38, -37, -37, -36, -35, -35, -34, -33, -33, -32, -32, -31, -31, -30, -30, -30, -30, -29, -29, -29, -29, -29, -28, -28, -28, -28, -27, -27, -27, -27, -27, -27, -26, -25, -25, -24, -24, -23, -23, -23, -23, -22, -22, -22, -21, -21, -21, -21, -21, -22, -22, -22, -22, -21, -20, -20, -19, -20, -19, -18, -17, -17, -16, -16, -16, -15, -14, -14, -13, -12, -12, -12, -11, -11, -10, -9, -9, -8, -7, -6, -6, -5, -4, -3, -2, -2, -1, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 15, 16, 17, 17, 18, 19, 20, 19, 19, 20, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 20, 20, 19, 20, 20, 21, 20, 21, 21, 22, 22, 23, 23, 24, 24, 24, 23, 22, 20, 15, 9, 15, 18, 20, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 18, 18, 18, 19, 19, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 36, 36, 36, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 33, 32, 31, 32, 32, 32, 32, 31, 30, 30, 29, 29, 30, 30, 30, 29, 29, 27, 26, 25, 24, 23, 19, 16, 14, 13, 12, 12, 10, 9, 8, 7, 6, 5, 3, 2, 0, -1, -2, -3, -4, -6, -7, -8, -8, -9, -11, -12, -13, -14, -15, -16, -18, -19, -20, -21, -22, -23, -24, -24, -25, -26, -27, -27, -28, -29, -29, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -28, -29, -29, -29, -30, -34, -34, -33, -34, -36, -37, -38, -39, -40, -41, -41, -42, -43, -44, -44, -45, -45, -45, -45, -45, -45, -45, -45, - /* -58.0 */ -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40, -39, -38, -38, -37, -37, -36, -35, -34, -34, -33, -33, -32, -31, -31, -30, -30, -29, -29, -28, -28, -28, -27, -27, -27, -27, -27, -27, -26, -26, -26, -26, -26, -25, -25, -25, -24, -23, -23, -23, -22, -22, -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -19, -20, -20, -20, -19, -19, -19, -19, -19, -18, -18, -17, -17, -17, -16, -16, -15, -15, -14, -14, -13, -13, -12, -11, -11, -11, -10, -9, -8, -8, -8, -7, -6, -6, -5, -4, -3, -2, -1, -0, 1, 1, 3, 4, 5, 7, 8, 10, 11, 13, 13, 15, 15, 16, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 19, 19, 20, 20, 20, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22, 20, 15, 10, 15, 18, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 28, 27, 28, 28, 29, 29, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 37, 37, 37, 37, 38, 38, 37, 37, 37, 36, 36, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 34, 33, 32, 31, 32, 31, 31, 30, 30, 30, 30, 30, 30, 30, 29, 28, 28, 26, 25, 23, 21, 18, 16, 15, 15, 14, 13, 12, 10, 9, 8, 7, 6, 4, 3, 1, -0, -1, -2, -4, -5, -6, -7, -8, -9, -10, -11, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -24, -25, -26, -26, -27, -27, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -27, -27, -28, -28, -32, -32, -28, -31, -32, -34, -35, -36, -37, -38, -39, -39, -41, -41, -42, -42, -42, -42, -42, -42, -43, -43, -43, -43, - /* -57.0 */ -40, -40, -40, -40, -39, -39, -39, -39, -39, -38, -37, -37, -36, -36, -35, -35, -34, -33, -33, -32, -31, -31, -30, -30, -29, -28, -28, -27, -27, -27, -26, -26, -26, -25, -25, -25, -25, -25, -25, -24, -23, -23, -22, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -20, -19, -19, -18, -18, -19, -19, -19, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -15, -15, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -9, -9, -9, -8, -7, -7, -6, -5, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 12, 14, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 19, 18, 19, 19, 18, 18, 18, 19, 19, 18, 19, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 23, 23, 23, 23, 22, 20, 16, 8, 9, 16, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 24, 23, 23, 23, 23, 22, 22, 22, 22, 21, 20, 20, 19, 20, 20, 20, 20, 21, 22, 23, 25, 25, 26, 27, 28, 28, 29, 29, 29, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 37, 37, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 35, 34, 34, 34, 32, 31, 31, 30, 29, 29, 28, 26, 23, 20, 19, 18, 17, 16, 16, 15, 13, 12, 11, 10, 9, 8, 6, 5, 4, 2, 1, -1, -2, -3, -4, -5, -7, -8, -9, -10, -11, -12, -14, -15, -16, -17, -18, -19, -20, -21, -22, -22, -23, -24, -24, -25, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -26, -26, -30, -30, -27, -30, -29, -31, -33, -34, -35, -36, -36, -37, -38, -38, -39, -39, -40, -40, -40, -40, -40, -40, -40, -40, - /* -56.0 */ -37, -37, -38, -37, -37, -37, -37, -36, -36, -35, -35, -34, -34, -33, -33, -32, -32, -31, -30, -30, -30, -29, -28, -27, -27, -27, -26, -26, -25, -25, -24, -24, -24, -24, -23, -23, -23, -23, -22, -21, -21, -20, -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -18, -19, -18, -17, -17, -16, -15, -15, -14, -14, -14, -14, -14, -14, -14, -15, -14, -14, -14, -15, -14, -14, -14, -14, -14, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -10, -9, -9, -8, -7, -7, -6, -5, -4, -3, -2, -2, -1, 1, 2, 3, 4, 5, 5, 5, 5, 4, 6, 11, 14, 15, 16, 14, 13, 14, 15, 16, 17, 18, 18, 19, 18, 17, 18, 18, 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 17, 18, 18, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 17, 5, 5, 15, 19, 20, 20, 21, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 26, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 23, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 31, 31, 31, 32, 31, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 41, 41, 41, 42, 41, 41, 41, 41, 41, 41, 40, 40, 39, 39, 39, 38, 38, 37, 37, 37, 36, 36, 35, 35, 35, 35, 36, 36, 35, 34, 34, 33, 33, 33, 33, 32, 31, 31, 30, 29, 27, 24, 22, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 10, 9, 8, 7, 5, 4, 3, 1, 0, -1, -2, -4, -5, -6, -7, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -20, -21, -21, -22, -23, -23, -24, -25, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -24, -23, -23, -23, -22, -22, -22, -23, -23, -23, -23, -24, -24, -24, -24, -25, -25, -26, -27, -28, -28, -29, -31, -32, -32, -31, -32, -33, -34, -35, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, - /* -55.0 */ -34, -35, -35, -35, -35, -34, -34, -34, -33, -33, -32, -32, -31, -31, -31, -30, -30, -30, -29, -28, -27, -27, -26, -26, -25, -25, -24, -24, -24, -23, -23, -23, -23, -23, -23, -22, -21, -21, -20, -20, -20, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -17, -16, -16, -15, -15, -14, -14, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -10, -8, -7, -6, -5, -5, -5, -4, -3, -3, -2, -1, 1, 2, 3, 4, 5, 5, 3, 3, 7, 10, 11, 13, 14, 14, 14, 14, 12, 11, 12, 13, 15, 17, 17, 18, 18, 17, 15, 14, 14, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 17, 19, 21, 23, 21, 17, 11, 12, 10, 8, 7, 4, 3, 8, 15, 18, 20, 21, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 25, 25, 24, 24, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 34, 33, 33, 34, 34, 35, 35, 36, 37, 38, 39, 40, 41, 43, 44, 44, 45, 45, 44, 44, 44, 44, 44, 43, 42, 41, 41, 41, 41, 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 35, 35, 34, 35, 35, 35, 35, 34, 34, 34, 33, 33, 32, 30, 28, 25, 23, 21, 20, 19, 19, 18, 17, 15, 14, 13, 12, 10, 9, 8, 7, 5, 4, 2, 2, 0, -1, -2, -3, -5, -6, -7, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -20, -20, -21, -22, -22, -23, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -24, -25, -24, -24, -24, -24, -23, -23, -22, -22, -21, -21, -21, -21, -21, -22, -22, -22, -22, -22, -22, -22, -23, -23, -23, -22, -23, -26, -26, -27, -27, -28, -27, -26, -25, -26, -28, -30, -32, -33, -34, -34, -33, -33, -33, -34, -34, -34, - /* -54.0 */ -31, -32, -32, -31, -31, -31, -31, -31, -31, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -23, -23, -23, -23, -22, -21, -21, -21, -20, -20, -20, -19, -19, -18, -18, -18, -18, -17, -17, -18, -19, -19, -18, -18, -17, -16, -15, -15, -14, -14, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -12, -12, -12, -12, -12, -11, -10, -10, -9, -9, -9, -9, -9, -8, -7, -6, -6, -5, -5, -4, -4, -3, -2, -1, 0, 2, 3, 4, 5, 5, 4, 4, 9, 12, 10, 9, 10, 12, 12, 12, 12, 11, 10, 9, 10, 11, 10, 10, 10, 9, 7, 7, 9, 12, 13, 12, 11, 11, 12, 14, 14, 14, 13, 14, 16, 16, 15, 17, 18, 18, 17, 12, 12, 13, 13, 13, 14, 14, 13, 14, 15, 17, 19, 21, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 27, 27, 27, 27, 28, 28, 27, 27, 26, 26, 27, 27, 28, 28, 28, 29, 29, 31, 31, 32, 33, 34, 35, 36, 36, 36, 37, 34, 35, 36, 36, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 47, 47, 47, 46, 45, 45, 44, 45, 43, 43, 44, 45, 43, 41, 41, 40, 39, 38, 38, 38, 37, 36, 36, 35, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 33, 31, 27, 24, 23, 24, 22, 20, 20, 18, 17, 16, 14, 13, 12, 11, 9, 8, 7, 6, 4, 3, 1, 0, -1, -2, -4, -5, -6, -7, -9, -10, -11, -12, -14, -15, -16, -17, -18, -19, -20, -20, -21, -22, -22, -23, -23, -24, -24, -25, -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -21, -20, -20, -20, -20, -19, -21, -21, -21, -21, -21, -21, -21, -21, -22, -22, -22, -22, -19, -23, -22, -23, -23, -24, -22, -22, -22, -22, -23, -24, -24, -26, -28, -29, -30, -30, -31, -31, -31, -31, - /* -53.0 */ -28, -28, -29, -28, -29, -29, -28, -28, -28, -28, -27, -27, -26, -26, -26, -26, -25, -25, -25, -24, -24, -23, -23, -22, -22, -23, -23, -22, -21, -21, -21, -20, -20, -20, -20, -19, -19, -19, -18, -18, -18, -18, -18, -19, -20, -20, -20, -19, -18, -17, -17, -16, -16, -15, -14, -14, -13, -13, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -10, -10, -9, -9, -8, -8, -8, -8, -8, -7, -6, -6, -5, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 5, 5, 9, 11, 10, 10, 9, 9, 11, 12, 12, 12, 13, 13, 12, 12, 11, 11, 11, 10, 10, 8, 6, 5, 5, 6, 7, 6, 4, 6, 8, 6, 4, 4, 6, 6, 4, 3, 3, 5, 10, 11, 12, 13, 15, 15, 16, 16, 16, 16, 16, 16, 17, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 26, 26, 26, 27, 27, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 36, 37, 38, 38, 38, 37, 36, 37, 37, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 48, 48, 51, 50, 47, 46, 47, 45, 44, 45, 43, 43, 42, 41, 41, 41, 39, 38, 37, 37, 36, 35, 35, 35, 35, 35, 35, 34, 34, 35, 37, 40, 39, 37, 35, 34, 32, 30, 28, 26, 24, 23, 22, 20, 19, 17, 16, 15, 13, 12, 11, 9, 8, 7, 5, 4, 3, 1, -0, -1, -3, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -21, -22, -23, -23, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -22, -21, -21, -20, -20, -19, -19, -19, -19, -19, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -17, -19, -19, -20, -21, -20, -19, -19, -19, -18, -18, -19, -20, -21, -23, -26, -27, -27, -28, -28, -28, - /* -52.0 */ -25, -25, -25, -26, -26, -26, -26, -25, -25, -24, -24, -24, -24, -24, -23, -23, -23, -23, -22, -22, -21, -21, -21, -22, -22, -21, -20, -20, -20, -20, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -19, -20, -19, -19, -19, -19, -18, -18, -17, -17, -16, -15, -15, -14, -13, -13, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -9, -9, -8, -8, -8, -7, -7, -7, -6, -5, -5, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 5, 5, 7, 13, 13, 13, 11, 10, 9, 10, 10, 10, 11, 12, 13, 14, 14, 14, 12, 12, 12, 12, 11, 10, 9, 8, 7, 6, 6, 6, 5, 4, 4, 5, 5, 5, 5, 5, 6, 7, 8, 10, 11, 10, 13, 15, 15, 15, 16, 15, 15, 15, 18, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 29, 30, 31, 31, 33, 33, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 38, 37, 36, 39, 39, 38, 39, 40, 41, 43, 44, 45, 46, 47, 49, 49, 47, 47, 47, 47, 47, 46, 45, 44, 44, 43, 43, 43, 42, 42, 41, 40, 39, 38, 37, 37, 36, 36, 36, 35, 35, 35, 34, 35, 37, 38, 38, 38, 37, 36, 33, 30, 29, 28, 27, 25, 23, 22, 21, 19, 18, 16, 15, 14, 12, 11, 9, 8, 6, 5, 4, 2, 1, -1, -2, -3, -5, -6, -7, -8, -10, -11, -12, -13, -14, -16, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -23, -24, -24, -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -15, -16, -17, -17, -18, -18, -15, -16, -16, -15, -16, -16, -17, -17, -19, -21, -23, -24, -24, -24, -25, - /* -51.0 */ -21, -21, -21, -21, -22, -23, -23, -22, -22, -21, -21, -21, -21, -21, -21, -21, -21, -21, -20, -20, -20, -20, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -18, -18, -17, -17, -18, -19, -18, -18, -18, -18, -18, -18, -18, -18, -17, -16, -15, -15, -14, -13, -13, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -8, -8, -8, -7, -7, -7, -6, -6, -5, -4, -4, -3, -2, -1, -0, 1, 2, 2, 3, 5, 5, 5, 5, 9, 14, 15, 15, 13, 11, 10, 10, 10, 10, 11, 12, 13, 13, 12, 12, 13, 13, 13, 12, 11, 10, 10, 9, 7, 6, 6, 6, 6, 5, 6, 6, 8, 9, 8, 7, 6, 6, 7, 7, 8, 8, 10, 10, 11, 12, 12, 13, 13, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 27, 27, 27, 27, 27, 26, 26, 25, 25, 25, 25, 25, 25, 26, 26, 27, 27, 27, 29, 31, 31, 32, 32, 33, 34, 34, 34, 35, 35, 36, 36, 37, 37, 38, 36, 38, 40, 40, 39, 40, 41, 42, 43, 44, 46, 46, 46, 47, 46, 47, 46, 46, 46, 45, 45, 44, 44, 44, 44, 43, 43, 41, 41, 40, 39, 38, 38, 37, 37, 36, 36, 37, 37, 36, 35, 38, 39, 38, 38, 37, 36, 33, 31, 30, 29, 28, 27, 25, 24, 22, 20, 19, 18, 16, 15, 13, 12, 11, 9, 8, 6, 5, 3, 2, 0, -1, -3, -4, -5, -7, -8, -9, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -21, -22, -23, -23, -23, -24, -24, -24, -23, -23, -23, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -19, -18, -18, -18, -17, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -16, -15, -14, -12, -12, -14, -14, -11, -12, -12, -12, -13, -13, -14, -14, -15, -16, -18, -20, -20, -21, -21, - /* -50.0 */ -17, -17, -17, -15, -17, -19, -20, -19, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -17, -16, -16, -16, -16, -16, -17, -17, -16, -17, -18, -18, -18, -17, -17, -17, -18, -18, -18, -18, -17, -17, -17, -16, -15, -14, -14, -13, -12, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -1, -0, 0, 1, 2, 3, 4, 5, 6, 5, 6, 10, 13, 16, 16, 14, 13, 11, 10, 10, 11, 11, 11, 12, 13, 13, 13, 12, 12, 11, 11, 9, 8, 6, 4, 3, 3, 2, 2, 2, 2, 2, 3, 5, 6, 6, 6, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 25, 25, 26, 26, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 25, 25, 25, 25, 24, 25, 25, 24, 25, 24, 25, 25, 26, 26, 27, 28, 30, 31, 31, 32, 33, 33, 34, 34, 35, 35, 35, 36, 37, 37, 38, 38, 40, 40, 40, 41, 41, 42, 43, 43, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 44, 44, 44, 43, 43, 42, 41, 40, 39, 38, 37, 37, 36, 39, 40, 39, 37, 39, 41, 40, 37, 37, 36, 35, 33, 32, 31, 30, 29, 27, 26, 24, 23, 22, 20, 19, 17, 16, 14, 13, 11, 10, 9, 7, 6, 4, 2, 1, -1, -2, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -23, -23, -23, -24, -24, -24, -24, -23, -23, -23, -22, -22, -22, -21, -20, -20, -19, -19, -18, -18, -19, -18, -18, -17, -17, -17, -18, -18, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -16, -15, -14, -13, -13, -11, -10, -12, -10, -9, -10, -10, -10, -10, -10, -10, -11, -12, -13, -13, -14, -15, -17, - /* -49.0 */ -10, -12, -14, -15, -16, -16, -16, -16, -17, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -17, -16, -16, -15, -15, -15, -15, -15, -15, -16, -16, -15, -16, -16, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -16, -16, -15, -15, -14, -13, -13, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -7, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -1, -1, 0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 10, 15, 16, 17, 16, 15, 13, 12, 12, 11, 11, 11, 11, 12, 11, 11, 11, 10, 10, 9, 7, 6, 3, 1, -0, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 1, 1, 2, 3, 3, 4, 4, 6, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 19, 20, 21, 21, 23, 23, 24, 25, 26, 27, 27, 27, 28, 27, 27, 26, 26, 25, 25, 25, 24, 24, 24, 24, 23, 24, 24, 25, 24, 24, 25, 23, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 33, 33, 33, 34, 34, 34, 35, 35, 37, 38, 39, 40, 42, 42, 42, 42, 43, 43, 42, 43, 44, 44, 45, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 44, 44, 43, 42, 41, 41, 40, 39, 38, 38, 38, 37, 37, 38, 39, 41, 41, 40, 38, 36, 34, 33, 32, 31, 30, 29, 28, 26, 25, 24, 22, 21, 20, 18, 17, 15, 14, 12, 11, 9, 8, 6, 5, 3, 2, 0, -2, -3, -5, -6, -8, -9, -10, -12, -13, -14, -15, -17, -18, -19, -19, -20, -21, -22, -22, -23, -23, -23, -24, -24, -24, -24, -24, -24, -24, -23, -23, -22, -22, -21, -21, -20, -20, -19, -18, -18, -17, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -14, -15, -16, -16, -16, -16, -16, -15, -15, -14, -12, -12, -11, -10, -11, -8, -9, -6, -7, -8, -8, -8, -7, -7, -7, -7, -8, -9, -9, -9, -10, - /* -48.0 */ -5, -8, -11, -12, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -14, -13, -14, -14, -14, -14, -14, -15, -15, -16, -16, -16, -16, -17, -17, -17, -17, -17, -17, -17, -16, -16, -15, -15, -15, -14, -14, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -3, -2, -2, -1, -1, -0, 1, 2, 2, 3, 4, 5, 6, 7, 7, 7, 11, 15, 16, 17, 18, 16, 15, 14, 12, 11, 11, 11, 11, 11, 11, 11, 10, 8, 7, 5, 4, 2, 1, -0, -1, -2, -2, -2, -3, -3, -3, -2, -1, -1, -1, -1, -0, -0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 10, 11, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 28, 27, 27, 26, 25, 25, 24, 24, 24, 24, 23, 23, 23, 22, 23, 23, 24, 24, 26, 25, 26, 26, 26, 27, 28, 29, 30, 30, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 35, 37, 39, 40, 41, 44, 44, 44, 43, 43, 43, 43, 44, 44, 44, 43, 44, 44, 45, 45, 45, 45, 45, 45, 45, 44, 44, 43, 43, 42, 41, 40, 38, 38, 37, 36, 36, 36, 39, 39, 40, 40, 39, 37, 35, 33, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 20, 19, 17, 16, 15, 13, 11, 10, 8, 7, 5, 4, 2, 1, -1, -3, -4, -6, -7, -9, -10, -12, -13, -14, -16, -17, -18, -19, -20, -21, -22, -22, -23, -24, -24, -24, -24, -25, -25, -25, -25, -25, -24, -24, -24, -23, -23, -22, -22, -21, -20, -20, -19, -18, -18, -17, -18, -17, -17, -17, -16, -16, -16, -15, -14, -14, -14, -15, -15, -15, -15, -15, -15, -14, -14, -13, -11, -10, -9, -8, -11, -10, -6, -3, -4, -5, -5, -6, -5, -5, -5, -5, -6, -5, -5, -4, -5, - /* -47.0 */ -5, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -14, -14, -14, -14, -15, -15, -15, -16, -16, -17, -17, -17, -16, -16, -16, -16, -16, -15, -15, -14, -14, -14, -13, -13, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -7, -7, -7, -6, -6, -6, -5, -5, -4, -3, -2, -1, -0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 13, 18, 20, 20, 17, 16, 14, 13, 12, 12, 12, 11, 12, 11, 11, 9, 7, 6, 4, 2, 0, -1, -1, -2, -3, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1, 0, 2, 3, 4, 6, 7, 9, 11, 12, 14, 15, 16, 17, 19, 20, 21, 23, 23, 25, 26, 26, 27, 28, 27, 27, 27, 27, 27, 25, 25, 24, 24, 24, 23, 23, 23, 22, 22, 22, 22, 23, 24, 25, 26, 25, 26, 26, 26, 27, 27, 28, 29, 30, 31, 31, 32, 32, 33, 33, 33, 33, 33, 34, 34, 35, 37, 40, 41, 43, 45, 45, 45, 44, 46, 43, 45, 44, 43, 43, 44, 45, 46, 46, 45, 45, 46, 48, 48, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 34, 36, 38, 37, 36, 36, 35, 33, 32, 31, 30, 29, 28, 26, 25, 24, 23, 22, 20, 19, 18, 16, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -1, -2, -4, -6, -7, -9, -10, -12, -13, -15, -16, -17, -19, -20, -21, -21, -22, -23, -24, -25, -25, -25, -25, -25, -26, -26, -26, -25, -25, -25, -25, -24, -24, -23, -23, -22, -21, -20, -20, -19, -18, -17, -17, -18, -17, -17, -17, -16, -16, -15, -13, -12, -13, -14, -14, -14, -14, -13, -13, -13, -12, -12, -11, -11, -9, -7, -7, -7, -8, -4, -2, 1, 1, -1, -2, -2, -2, -2, -3, -3, -3, -3, -4, -5, - /* -46.0 */ -2, -3, -4, -4, -4, -5, -5, -6, -7, -8, -9, -9, -10, -10, -10, -10, -11, -10, -10, -10, -10, -10, -10, -10, -9, -10, -10, -11, -11, -12, -12, -13, -13, -14, -14, -14, -15, -15, -15, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -13, -13, -13, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -6, -6, -6, -5, -5, -4, -4, -3, -3, -2, -1, -0, 0, 1, 2, 2, 4, 5, 5, 7, 8, 9, 10, 11, 11, 15, 18, 23, 23, 19, 16, 15, 14, 13, 12, 12, 12, 12, 11, 10, 9, 5, 4, 2, 0, -0, -1, -2, -3, -3, -4, -4, -4, -4, -4, -3, -4, -4, -5, -5, -4, -4, -3, -3, -2, -1, 0, 2, 3, 5, 7, 9, 10, 12, 13, 15, 16, 17, 19, 20, 22, 23, 24, 25, 26, 27, 27, 27, 26, 27, 26, 25, 25, 25, 24, 23, 23, 23, 23, 23, 22, 22, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 35, 38, 40, 42, 45, 45, 46, 46, 46, 45, 46, 45, 46, 46, 44, 46, 47, 47, 45, 47, 52, 50, 47, 44, 43, 43, 42, 41, 40, 38, 37, 35, 34, 34, 33, 33, 33, 34, 34, 33, 33, 32, 31, 30, 29, 29, 28, 27, 25, 24, 23, 22, 20, 19, 18, 17, 15, 14, 12, 11, 9, 7, 6, 4, 2, 1, -1, -3, -4, -6, -7, -9, -11, -12, -14, -15, -16, -18, -19, -21, -21, -22, -23, -24, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -24, -24, -23, -22, -22, -21, -20, -19, -18, -18, -17, -18, -17, -16, -16, -16, -15, -14, -14, -14, -14, -14, -13, -13, -12, -12, -11, -11, -10, -10, -9, -8, -8, -7, -5, -5, -5, -2, 4, 4, 5, 6, 3, 1, 1, 1, 1, 1, 0, -0, -1, -2, - /* -45.0 */ 3, 3, 3, 3, 1, -0, -1, -3, -4, -5, -6, -7, -8, -8, -8, -9, -8, -8, -8, -8, -8, -8, -7, -8, -8, -8, -9, -10, -10, -11, -12, -12, -12, -13, -13, -13, -14, -14, -15, -15, -15, -15, -15, -16, -16, -15, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -4, -3, -3, -2, -2, -1, -0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 9, 10, 11, 11, 13, 16, 19, 19, 18, 17, 16, 15, 14, 12, 12, 12, 11, 11, 11, 9, 5, 3, 2, 0, 0, -0, -1, -2, -3, -3, -3, -4, -4, -4, -3, -4, -4, -5, -5, -5, -4, -4, -3, -3, -2, -0, 1, 3, 5, 7, 9, 10, 12, 13, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 24, 24, 23, 22, 21, 21, 21, 21, 22, 22, 22, 23, 24, 25, 26, 26, 26, 27, 27, 28, 28, 29, 30, 31, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 35, 38, 39, 42, 44, 46, 46, 47, 46, 46, 46, 46, 45, 45, 46, 46, 46, 45, 44, 45, 45, 44, 43, 43, 42, 41, 40, 39, 37, 36, 34, 33, 32, 32, 32, 31, 31, 31, 31, 31, 30, 30, 29, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 16, 15, 14, 12, 11, 9, 8, 6, 4, 3, 1, -1, -3, -5, -6, -8, -9, -11, -13, -14, -16, -17, -19, -20, -21, -22, -23, -24, -25, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -26, -25, -24, -24, -23, -22, -21, -20, -19, -19, -18, -17, -17, -17, -16, -16, -15, -15, -14, -13, -13, -12, -12, -12, -11, -11, -10, -9, -9, -8, -8, -8, -7, -6, -4, -3, -3, -3, -6, -1, 4, 5, 8, 7, 6, 5, 5, 6, 5, 5, 5, 4, 3, - /* -44.0 */ 10, 10, 9, 10, 9, 6, 3, 1, -0, -2, -4, -4, -5, -5, -6, -6, -6, -5, -6, -4, -6, -7, -7, -7, -7, -7, -8, -9, -9, -10, -10, -11, -11, -12, -12, -12, -13, -14, -14, -14, -15, -15, -15, -15, -14, -15, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, -2, -2, -1, -0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 12, 14, 17, 18, 18, 19, 18, 16, 15, 14, 12, 11, 11, 11, 11, 10, 6, 6, 2, 1, 1, -0, -1, -2, -2, -2, -3, -3, -3, -3, -4, -5, -5, -6, -6, -6, -6, -5, -4, -3, -2, -0, 1, 3, 5, 7, 8, 10, 12, 13, 15, 16, 18, 19, 21, 22, 23, 24, 25, 26, 25, 26, 26, 26, 25, 25, 25, 24, 24, 23, 23, 22, 22, 23, 22, 21, 21, 21, 21, 21, 22, 23, 24, 24, 25, 26, 27, 27, 28, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 33, 34, 34, 33, 33, 33, 34, 34, 35, 38, 40, 42, 44, 45, 46, 46, 46, 46, 44, 44, 44, 45, 44, 44, 44, 44, 44, 43, 43, 43, 42, 41, 39, 39, 37, 36, 34, 33, 32, 32, 31, 31, 30, 30, 30, 30, 29, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 16, 15, 13, 12, 11, 9, 8, 6, 4, 3, 1, -1, -3, -5, -6, -8, -10, -12, -13, -14, -16, -18, -19, -21, -22, -23, -24, -25, -26, -27, -28, -28, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26, -26, -25, -24, -23, -23, -22, -21, -20, -19, -18, -17, -17, -16, -16, -15, -15, -13, -10, -8, -9, -11, -9, -9, -9, -9, -8, -7, -7, -6, -6, -6, -5, -4, -3, -1, -1, 0, 1, -0, 2, 5, 8, 9, 9, 11, 10, 11, 12, 11, 11, 10, 10, - /* -43.0 */ 14, 13, 12, 12, 10, 9, 7, 4, 3, 2, 0, -1, -2, -2, -3, -3, -3, -3, -3, -4, -4, -4, -5, -5, -6, -6, -7, -7, -8, -9, -9, -10, -11, -11, -12, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -8, -7, -6, -5, -5, -5, -4, -4, -3, -2, -2, -1, -0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 12, 15, 17, 20, 20, 20, 20, 19, 16, 14, 13, 13, 12, 11, 12, 11, 9, 6, 4, 1, 1, 0, -1, -2, -2, -2, -3, -3, -3, -4, -4, -5, -6, -7, -7, -7, -6, -6, -5, -3, -2, -1, 1, 3, 5, 7, 8, 10, 11, 13, 14, 16, 18, 19, 20, 22, 23, 24, 25, 25, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 22, 21, 22, 21, 19, 19, 20, 21, 21, 21, 22, 23, 24, 25, 25, 26, 28, 28, 28, 28, 28, 29, 29, 30, 30, 31, 32, 33, 33, 33, 34, 34, 33, 34, 34, 33, 33, 34, 35, 37, 40, 41, 43, 43, 44, 45, 45, 44, 43, 44, 44, 43, 43, 44, 44, 43, 43, 42, 42, 41, 39, 38, 37, 36, 35, 33, 32, 32, 31, 30, 30, 30, 29, 29, 28, 27, 27, 26, 25, 24, 24, 23, 22, 21, 20, 19, 18, 16, 15, 13, 12, 11, 9, 8, 6, 4, 3, 1, -1, -3, -5, -7, -8, -11, -12, -14, -16, -17, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -29, -29, -28, -28, -27, -27, -26, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -16, -15, -15, -14, -9, -5, -4, -5, -8, -9, -8, -8, -7, -6, -5, -5, -4, -4, -3, -3, -2, -0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 13, 12, 10, 12, 14, 14, 15, 14, 14, - /* -42.0 */ 15, 15, 14, 13, 11, 10, 9, 7, 5, 4, 3, 2, 1, 0, 0, -1, 0, -0, -2, -2, -2, -3, -4, -4, -4, -5, -5, -6, -7, -7, -8, -9, -10, -11, -11, -12, -12, -12, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -5, -5, -4, -4, -3, -2, -2, -1, -0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 16, 17, 20, 21, 22, 23, 23, 19, 16, 14, 13, 13, 12, 12, 12, 12, 10, 6, 2, 1, 0, -1, -1, -2, -3, -3, -3, -4, -4, -5, -6, -7, -8, -8, -7, -6, -5, -4, -3, -2, -1, 1, 3, 5, 6, 8, 10, 11, 13, 14, 16, 18, 19, 20, 22, 23, 24, 25, 25, 25, 25, 25, 24, 24, 24, 24, 23, 23, 22, 22, 21, 20, 20, 20, 24, 21, 22, 20, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 29, 29, 29, 29, 30, 30, 31, 31, 32, 34, 35, 35, 35, 34, 34, 33, 33, 33, 34, 35, 37, 38, 40, 41, 42, 43, 44, 44, 43, 44, 44, 43, 43, 43, 43, 42, 42, 40, 40, 39, 37, 36, 35, 35, 33, 32, 31, 30, 30, 29, 28, 28, 28, 28, 27, 26, 25, 24, 23, 22, 22, 21, 20, 19, 18, 17, 16, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -1, -3, -5, -7, -9, -11, -13, -14, -16, -18, -19, -21, -22, -24, -25, -26, -27, -28, -29, -30, -31, -31, -31, -32, -32, -31, -31, -31, -31, -31, -31, -30, -30, -29, -29, -28, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -15, -14, -12, -6, -2, -1, -2, -5, -7, -7, -6, -5, -4, -3, -2, -2, -1, -1, -0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 15, 15, 11, 9, 10, 11, 14, 16, 15, - /* -41.0 */ 19, 18, 17, 15, 13, 12, 10, 7, 6, 5, 4, 4, 3, 2, 2, 4, 2, 0, 0, -1, -1, -1, -1, -1, -2, -3, -4, -4, -5, -6, -7, -8, -10, -10, -11, -11, -11, -11, -12, -12, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -8, -8, -8, -8, -7, -7, -5, -4, -4, -3, -3, -2, -2, -1, -1, -0, -0, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 11, 11, 16, 19, 21, 22, 23, 24, 23, 20, 16, 14, 14, 13, 13, 13, 13, 12, 11, 9, 5, 2, 1, -0, -1, -2, -3, -3, -4, -5, -5, -6, -7, -8, -8, -8, -7, -6, -5, -4, -3, -2, -1, 0, 2, 4, 6, 8, 10, 11, 13, 14, 16, 18, 19, 20, 21, 22, 23, 24, 25, 24, 24, 24, 24, 24, 23, 23, 23, 22, 22, 20, 20, 20, 19, 18, 17, 18, 18, 19, 19, 20, 21, 22, 23, 25, 26, 27, 27, 27, 29, 29, 29, 29, 29, 29, 30, 30, 30, 31, 33, 35, 36, 35, 35, 33, 33, 33, 33, 33, 33, 35, 36, 37, 38, 39, 40, 42, 43, 43, 43, 44, 43, 43, 42, 42, 41, 41, 40, 39, 37, 36, 35, 34, 32, 31, 30, 29, 29, 28, 28, 27, 27, 27, 26, 26, 25, 24, 22, 21, 20, 19, 19, 18, 18, 16, 15, 14, 13, 11, 10, 8, 7, 5, 4, 2, 0, -2, -4, -5, -7, -9, -11, -13, -15, -17, -19, -20, -22, -23, -24, -26, -27, -28, -29, -30, -31, -32, -32, -33, -33, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -30, -30, -29, -28, -28, -27, -26, -25, -23, -22, -21, -20, -18, -17, -16, -16, -15, -14, -12, -6, -2, -1, -1, -0, -3, -5, -4, -3, -2, -1, -1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 16, 18, 16, 13, 13, 17, 16, 15, 17, 19, - /* -40.0 */ 21, 20, 19, 17, 15, 13, 11, 9, 8, 7, 6, 6, 5, 5, 6, 3, 3, 3, 2, 1, 1, 1, 0, -0, -1, -2, -2, -3, -4, -6, -7, -8, -9, -10, -10, -10, -10, -11, -11, -12, -12, -12, -12, -12, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -3, -3, -2, -2, -1, -1, -1, -0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 11, 10, 13, 17, 22, 23, 23, 23, 21, 19, 16, 15, 14, 13, 13, 14, 14, 13, 13, 12, 10, 5, 2, 0, -0, -2, -3, -4, -4, -5, -6, -6, -7, -7, -8, -7, -7, -6, -5, -4, -3, -2, -1, 0, 2, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 23, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 20, 19, 18, 18, 18, 17, 18, 18, 19, 19, 20, 20, 21, 22, 24, 25, 26, 26, 27, 26, 28, 28, 29, 29, 29, 29, 29, 30, 30, 32, 34, 35, 35, 34, 33, 33, 33, 34, 34, 33, 33, 34, 34, 35, 37, 38, 40, 41, 42, 43, 43, 43, 42, 42, 41, 40, 40, 39, 38, 36, 35, 33, 32, 31, 30, 29, 28, 27, 27, 27, 26, 26, 26, 25, 24, 23, 22, 21, 20, 18, 18, 17, 17, 16, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -1, -2, -4, -6, -8, -10, -12, -14, -16, -18, -19, -21, -23, -24, -25, -27, -28, -29, -30, -31, -32, -33, -33, -34, -34, -34, -34, -34, -34, -34, -34, -34, -33, -33, -32, -32, -31, -30, -30, -29, -28, -27, -26, -25, -24, -23, -21, -20, -18, -17, -15, -15, -14, -12, -7, -2, -2, -1, -0, 1, 0, -2, -2, -1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 10, 12, 12, 15, 18, 19, 19, 19, 20, 19, 15, 13, 16, 18, 19, 19, 21, - /* -39.0 */ 22, 22, 21, 19, 17, 16, 13, 12, 11, 10, 9, 8, 10, 8, 6, 6, 5, 4, 3, 3, 3, 2, 1, 1, 0, -1, -2, -3, -4, -6, -7, -8, -8, -9, -9, -9, -10, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -3, -3, -2, -2, -2, -1, -1, -1, -0, 1, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 9, 13, 17, 20, 24, 23, 20, 18, 17, 16, 14, 14, 14, 14, 13, 12, 13, 13, 13, 11, 8, 3, 1, -0, -2, -3, -4, -4, -5, -5, -6, -7, -7, -7, -7, -7, -6, -6, -5, -4, -3, -1, 1, 2, 4, 6, 8, 10, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 20, 20, 19, 19, 18, 17, 17, 17, 17, 18, 19, 19, 20, 20, 21, 22, 23, 24, 25, 26, 26, 28, 27, 28, 27, 28, 29, 29, 29, 30, 30, 30, 32, 34, 33, 32, 33, 32, 32, 32, 32, 32, 32, 32, 32, 33, 34, 36, 37, 39, 40, 40, 41, 41, 43, 42, 41, 40, 40, 38, 37, 35, 33, 31, 30, 29, 28, 27, 26, 26, 26, 26, 25, 25, 25, 24, 23, 22, 20, 19, 18, 17, 16, 16, 15, 15, 13, 11, 9, 8, 6, 5, 3, 2, 0, -2, -3, -5, -7, -9, -11, -12, -14, -16, -18, -20, -22, -23, -25, -27, -28, -29, -30, -31, -32, -33, -33, -34, -34, -35, -35, -35, -35, -35, -35, -35, -35, -35, -34, -34, -33, -33, -32, -31, -30, -29, -29, -28, -27, -26, -24, -23, -22, -20, -18, -16, -15, -13, -10, -6, -3, -1, 1, 2, 2, 3, 1, -1, 0, 2, 3, 4, 5, 5, 6, 7, 7, 7, 8, 9, 11, 13, 16, 16, 18, 21, 22, 22, 22, 22, 24, 23, 25, 25, 20, 21, 20, 22, - /* -38.0 */ 21, 23, 23, 22, 20, 18, 16, 14, 13, 13, 11, 12, 12, 9, 8, 7, 6, 5, 4, 4, 4, 3, 2, 1, -0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -8, -9, -10, -10, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -12, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -6, -5, -4, -4, -3, -3, -2, -2, -2, -2, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 9, 14, 20, 21, 24, 24, 21, 19, 18, 16, 16, 15, 16, 15, 14, 15, 15, 15, 13, 11, 9, 4, 2, 1, -1, -2, -3, -4, -5, -5, -6, -6, -7, -7, -7, -7, -7, -6, -5, -4, -3, -1, 1, 2, 4, 6, 8, 9, 11, 13, 14, 15, 16, 18, 19, 20, 20, 21, 22, 22, 22, 22, 22, 21, 21, 21, 21, 20, 20, 19, 19, 17, 16, 16, 16, 17, 17, 18, 19, 19, 20, 21, 22, 23, 23, 23, 24, 25, 26, 26, 27, 27, 27, 27, 27, 28, 29, 29, 29, 29, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 30, 30, 31, 32, 34, 35, 36, 37, 38, 39, 39, 41, 41, 41, 41, 39, 37, 36, 34, 32, 31, 29, 27, 26, 26, 25, 25, 25, 25, 24, 24, 23, 22, 21, 20, 19, 17, 16, 15, 14, 14, 13, 14, 12, 9, 7, 6, 4, 3, 1, -0, -2, -4, -6, -8, -10, -11, -13, -15, -17, -19, -21, -22, -24, -26, -27, -29, -30, -31, -32, -33, -34, -34, -34, -35, -35, -36, -36, -36, -37, -36, -37, -36, -36, -35, -35, -35, -34, -33, -33, -32, -31, -30, -29, -28, -27, -26, -24, -22, -21, -19, -17, -15, -12, -8, -4, -1, 2, 3, 4, 7, 7, 6, 7, 6, 2, 4, 5, 6, 7, 8, 9, 9, 9, 10, 11, 12, 13, 17, 18, 19, 21, 24, 25, 25, 24, 25, 26, 28, 30, 29, 26, 22, 21, 21, - /* -37.0 */ 20, 21, 23, 23, 22, 20, 18, 17, 15, 15, 14, 13, 12, 11, 10, 8, 7, 6, 6, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -5, -6, -6, -7, -7, -8, -8, -9, -10, -10, -10, -10, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -12, -12, -12, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, 0, 1, 2, 3, 5, 6, 7, 8, 9, 11, 11, 9, 12, 21, 21, 25, 25, 23, 20, 18, 17, 17, 17, 17, 16, 17, 17, 16, 15, 14, 12, 10, 8, 4, 2, -0, -2, -3, -4, -5, -5, -6, -6, -7, -7, -7, -7, -7, -6, -5, -4, -2, -1, 1, 2, 4, 6, 7, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 18, 18, 18, 17, 16, 16, 17, 17, 18, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 29, 29, 29, 29, 28, 30, 30, 30, 29, 30, 29, 30, 30, 31, 31, 30, 29, 28, 29, 30, 31, 31, 32, 34, 36, 37, 37, 37, 38, 39, 39, 38, 36, 36, 33, 31, 30, 28, 26, 25, 25, 24, 24, 24, 24, 23, 23, 22, 21, 19, 18, 17, 16, 15, 14, 13, 12, 12, 11, 10, 8, 5, 4, 2, 0, -1, -3, -5, -7, -8, -10, -12, -14, -16, -17, -19, -21, -23, -25, -26, -28, -29, -31, -32, -33, -34, -35, -36, -37, -37, -38, -39, -39, -39, -39, -39, -38, -39, -39, -38, -38, -37, -36, -35, -35, -34, -33, -32, -30, -29, -28, -27, -26, -25, -23, -21, -18, -13, -9, -6, -4, -1, 2, 4, 5, 7, 9, 12, 14, 14, 12, 6, 7, 8, 9, 10, 12, 11, 12, 12, 13, 14, 16, 17, 19, 21, 22, 24, 25, 26, 27, 27, 28, 29, 32, 33, 33, 30, 23, 21, 20, - /* -36.0 */ 23, 17, 22, 24, 24, 23, 21, 19, 18, 16, 16, 14, 14, 12, 11, 9, 9, 7, 6, 5, 4, 3, 2, 1, -0, -1, -2, -3, -3, -4, -4, -5, -6, -7, -7, -8, -9, -9, -9, -10, -10, -10, -10, -11, -11, -12, -11, -11, -11, -11, -11, -12, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -3, -3, -3, -2, -2, -1, -0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 11, 9, 19, 21, 25, 27, 26, 23, 20, 19, 18, 18, 18, 18, 17, 17, 17, 17, 15, 13, 11, 9, 7, 4, 1, -1, -3, -5, -5, -6, -6, -6, -7, -7, -7, -7, -7, -6, -5, -4, -3, -1, 1, 2, 4, 6, 7, 9, 10, 12, 13, 14, 16, 17, 18, 18, 19, 20, 20, 20, 20, 19, 19, 18, 18, 18, 18, 18, 17, 17, 17, 18, 17, 17, 17, 17, 18, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 29, 31, 31, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, 30, 30, 30, 29, 27, 27, 27, 27, 28, 28, 30, 32, 34, 35, 35, 34, 34, 34, 35, 34, 34, 33, 33, 31, 29, 27, 25, 24, 24, 24, 24, 24, 23, 23, 22, 20, 19, 18, 17, 15, 14, 13, 12, 11, 11, 10, 9, 8, 6, 4, 1, -0, -2, -3, -5, -7, -9, -11, -12, -14, -16, -18, -20, -22, -24, -25, -27, -28, -30, -31, -33, -33, -36, -37, -38, -39, -39, -40, -40, -40, -41, -41, -40, -39, -38, -38, -38, -38, -39, -38, -37, -36, -36, -35, -34, -33, -31, -30, -29, -28, -26, -24, -21, -18, -11, -7, -5, -3, -1, 1, 3, 5, 6, 8, 10, 12, 16, 19, 17, 10, 9, 10, 12, 13, 14, 14, 15, 15, 16, 18, 19, 20, 22, 24, 25, 25, 27, 28, 29, 29, 31, 33, 36, 37, 36, 34, 33, 28, 23, - /* -35.0 */ 28, 18, 20, 25, 26, 25, 23, 21, 20, 19, 17, 16, 14, 13, 12, 10, 9, 8, 6, 5, 5, 3, 2, 1, 0, -0, -1, -2, -3, -3, -4, -5, -6, -6, -7, -8, -8, -9, -9, -9, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -7, -7, -6, -6, -6, -6, -6, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -0, 1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 13, 10, 12, 21, 25, 30, 26, 22, 21, 20, 20, 19, 18, 18, 17, 17, 17, 16, 15, 14, 13, 10, 9, 8, 3, -0, -3, -5, -6, -6, -6, -7, -7, -8, -7, -7, -7, -6, -5, -4, -3, -1, 0, 2, 5, 7, 6, 8, 9, 11, 12, 14, 15, 16, 16, 17, 18, 18, 18, 19, 19, 18, 18, 18, 17, 17, 17, 17, 17, 17, 18, 17, 17, 17, 18, 18, 18, 19, 20, 20, 20, 21, 21, 22, 23, 24, 25, 25, 26, 26, 26, 26, 28, 30, 31, 32, 31, 30, 29, 29, 26, 27, 28, 27, 26, 26, 27, 28, 30, 30, 29, 27, 25, 25, 25, 26, 26, 27, 30, 33, 33, 33, 32, 31, 31, 31, 31, 30, 31, 30, 30, 29, 26, 25, 23, 22, 22, 22, 22, 22, 21, 20, 19, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 4, 2, -1, -2, -4, -6, -7, -9, -11, -13, -15, -17, -18, -20, -22, -24, -26, -28, -29, -30, -32, -33, -34, -37, -38, -40, -40, -40, -40, -40, -39, -38, -39, -40, -38, -35, -33, -32, -32, -34, -35, -35, -34, -33, -33, -33, -33, -33, -32, -31, -28, -25, -22, -19, -15, -11, -7, -4, -2, -0, 1, 2, 4, 6, 8, 10, 12, 14, 17, 20, 20, 17, 11, 13, 14, 15, 16, 17, 17, 17, 19, 21, 22, 24, 25, 26, 26, 27, 28, 31, 32, 32, 34, 38, 39, 38, 38, 38, 38, 37, 28, - /* -34.0 */ 37, 24, 18, 25, 27, 27, 26, 23, 21, 20, 17, 16, 16, 14, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -0, -2, -2, -3, -3, -4, -4, -5, -6, -7, -8, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -11, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -2, -1, -1, 0, 1, 2, 3, 5, 7, 7, 10, 10, 11, 12, 14, 13, 8, 19, 25, 32, 24, 22, 22, 23, 22, 21, 19, 18, 17, 17, 17, 17, 16, 16, 15, 13, 10, 8, 6, 2, -1, -3, -5, -6, -6, -7, -7, -8, -7, -7, -7, -6, -5, -4, -3, -1, 1, 3, 3, 5, 6, 7, 9, 9, 11, 12, 13, 14, 15, 16, 16, 17, 18, 18, 18, 18, 17, 17, 16, 16, 16, 16, 16, 16, 17, 18, 17, 18, 19, 18, 20, 20, 20, 21, 21, 21, 22, 23, 23, 24, 25, 25, 26, 26, 26, 27, 29, 31, 32, 33, 33, 32, 31, 30, 28, 27, 29, 28, 26, 26, 26, 27, 29, 29, 29, 26, 23, 23, 23, 23, 24, 25, 28, 31, 33, 31, 30, 28, 28, 28, 27, 27, 27, 28, 29, 27, 25, 24, 22, 21, 20, 20, 20, 20, 19, 18, 17, 16, 15, 14, 12, 11, 10, 9, 8, 7, 6, 5, 3, 1, -1, -2, -4, -6, -8, -9, -11, -13, -15, -17, -19, -21, -22, -24, -26, -28, -30, -31, -32, -33, -35, -37, -38, -40, -41, -41, -40, -40, -40, -37, -36, -37, -38, -36, -33, -31, -28, -28, -30, -30, -30, -30, -29, -27, -26, -27, -28, -28, -27, -24, -22, -18, -14, -11, -8, -4, -2, 1, 3, 4, 4, 6, 8, 10, 12, 14, 17, 19, 22, 24, 22, 18, 15, 17, 18, 19, 19, 20, 20, 23, 24, 26, 27, 27, 27, 28, 30, 32, 32, 33, 36, 39, 39, 39, 39, 40, 40, 41, 41, 37, - /* -33.0 */ 43, 35, 18, 24, 28, 28, 27, 24, 23, 20, 19, 18, 16, 14, 12, 11, 10, 9, 8, 7, 6, 5, 3, 2, 1, 1, -0, -1, -2, -2, -3, -4, -4, -5, -6, -7, -8, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -3, -2, -2, -2, -1, -1, -0, 0, 1, 3, 4, 5, 6, 6, 8, 9, 11, 12, 14, 15, 10, 15, 26, 32, 23, 21, 23, 25, 25, 23, 20, 19, 18, 17, 18, 17, 17, 16, 15, 13, 11, 8, 7, 4, -0, -3, -4, -5, -6, -7, -8, -8, -8, -8, -7, -6, -5, -3, -2, -1, 1, 2, 3, 4, 6, 7, 7, 8, 9, 11, 12, 13, 14, 14, 15, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 17, 17, 19, 19, 19, 20, 20, 23, 21, 22, 22, 22, 23, 23, 24, 24, 25, 26, 27, 27, 27, 28, 31, 31, 33, 34, 34, 32, 31, 29, 28, 29, 29, 30, 29, 25, 25, 25, 26, 27, 29, 26, 22, 20, 21, 21, 22, 23, 26, 31, 30, 28, 26, 25, 25, 24, 24, 23, 23, 24, 25, 25, 24, 22, 21, 19, 19, 18, 18, 17, 17, 16, 15, 14, 13, 12, 11, 9, 8, 7, 6, 5, 4, 3, 1, -1, -3, -5, -7, -8, -10, -11, -12, -15, -17, -19, -21, -23, -25, -27, -28, -30, -32, -33, -34, -35, -37, -39, -39, -40, -41, -40, -40, -41, -40, -38, -38, -39, -38, -36, -33, -30, -27, -27, -28, -28, -28, -28, -27, -26, -23, -22, -21, -21, -21, -19, -17, -15, -14, -11, -7, -2, 1, 3, 7, 7, 8, 8, 9, 12, 14, 17, 19, 22, 25, 27, 26, 25, 20, 19, 21, 24, 22, 24, 24, 27, 28, 29, 30, 29, 30, 30, 34, 34, 35, 36, 37, 38, 40, 40, 40, 41, 42, 42, 43, 43, - /* -32.0 */ 44, 41, 23, 20, 28, 30, 29, 25, 24, 21, 20, 19, 17, 15, 13, 12, 11, 10, 8, 7, 6, 4, 3, 2, 1, 1, 0, -0, -2, -2, -3, -3, -4, -5, -6, -7, -8, -9, -9, -10, -10, -10, -10, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -4, -3, -2, -2, -1, -1, -1, -0, 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 15, 16, 12, 15, 29, 32, 26, 21, 24, 25, 27, 25, 22, 20, 18, 17, 17, 17, 16, 15, 14, 13, 11, 8, 6, 5, -1, -3, -4, -5, -6, -8, -8, -7, -8, -7, -7, -6, -5, -2, -1, 0, 1, 2, 3, 4, 6, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 16, 17, 18, 19, 19, 19, 20, 20, 23, 21, 23, 23, 23, 23, 24, 24, 25, 25, 27, 27, 28, 29, 31, 30, 32, 33, 35, 37, 36, 35, 34, 34, 33, 33, 31, 31, 27, 24, 23, 23, 24, 25, 24, 20, 18, 18, 19, 20, 21, 24, 26, 26, 25, 23, 23, 21, 21, 20, 20, 20, 20, 21, 22, 21, 21, 21, 19, 16, 16, 15, 15, 14, 14, 13, 12, 11, 10, 9, 8, 6, 5, 4, 3, 2, 0, -2, -4, -6, -7, -9, -11, -13, -14, -15, -16, -19, -21, -23, -25, -26, -28, -30, -29, -31, -32, -34, -35, -36, -37, -40, -40, -41, -40, -41, -41, -40, -39, -39, -39, -38, -36, -35, -31, -27, -27, -26, -25, -26, -26, -24, -24, -22, -20, -19, -20, -19, -18, -15, -12, -12, -9, -4, 0, 2, 4, 9, 10, 12, 13, 12, 13, 16, 20, 22, 24, 26, 28, 30, 29, 27, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 31, 32, 32, 36, 37, 37, 39, 40, 41, 42, 42, 42, 42, 43, 43, 44, 44, - /* -31.0 */ 46, 45, 33, 19, 28, 31, 29, 28, 26, 23, 21, 19, 17, 16, 14, 12, 11, 10, 8, 7, 6, 4, 3, 2, 1, 1, -0, -1, -1, -2, -2, -3, -3, -5, -6, -7, -8, -8, -9, -9, -9, -9, -10, -11, -11, -12, -12, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -8, -7, -7, -7, -6, -6, -6, -5, -5, -5, -4, -4, -3, -2, -2, -1, -0, -0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 16, 13, 17, 31, 33, 27, 24, 25, 25, 27, 26, 22, 20, 18, 17, 17, 16, 15, 15, 14, 13, 11, 8, 6, 4, 1, -3, -5, -6, -8, -8, -8, -8, -9, -8, -7, -5, -4, -1, 1, 3, 3, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 15, 15, 15, 15, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 22, 24, 23, 23, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 31, 31, 32, 33, 35, 35, 35, 35, 35, 34, 35, 36, 36, 32, 30, 25, 22, 22, 22, 22, 22, 17, 16, 16, 16, 16, 18, 20, 22, 22, 22, 21, 19, 18, 17, 17, 17, 17, 18, 18, 18, 18, 19, 18, 18, 15, 14, 13, 13, 13, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, -0, -2, -4, -6, -8, -10, -12, -13, -15, -17, -17, -18, -21, -23, -25, -27, -28, -28, -30, -32, -34, -34, -36, -37, -37, -39, -39, -39, -40, -40, -40, -40, -40, -40, -39, -38, -37, -36, -31, -30, -26, -25, -25, -24, -24, -23, -24, -21, -20, -20, -19, -20, -18, -16, -13, -9, -7, -6, -2, 1, 4, 7, 11, 10, 14, 16, 16, 17, 18, 22, 24, 25, 27, 30, 32, 33, 31, 25, 26, 29, 28, 29, 31, 32, 33, 33, 34, 34, 34, 35, 37, 39, 40, 41, 42, 43, 45, 43, 43, 43, 44, 44, 45, 46, - /* -30.0 */ 48, 46, 40, 26, 25, 31, 31, 30, 27, 25, 23, 21, 19, 16, 15, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 1, -0, -1, -2, -2, -1, -2, -4, -5, -6, -6, -7, -7, -8, -8, -9, -9, -10, -11, -11, -12, -13, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -8, -7, -7, -7, -6, -6, -6, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 7, 8, 9, 10, 12, 13, 15, 16, 14, 15, 33, 37, 32, 27, 25, 24, 24, 26, 23, 21, 19, 18, 17, 15, 14, 13, 11, 10, 9, 6, 4, 3, 3, 1, -4, -6, -7, -8, -8, -9, -10, -9, -7, -6, -4, -1, -0, 0, 1, 1, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 17, 17, 18, 19, 20, 21, 23, 23, 25, 22, 23, 24, 24, 25, 26, 26, 26, 27, 28, 29, 32, 31, 32, 34, 35, 34, 33, 33, 33, 33, 32, 34, 33, 36, 35, 30, 28, 24, 21, 21, 20, 20, 16, 14, 13, 14, 14, 15, 15, 18, 19, 19, 18, 16, 15, 14, 14, 14, 15, 15, 15, 14, 14, 14, 15, 15, 14, 13, 12, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 1, 0, -1, -3, -5, -7, -9, -11, -13, -15, -16, -18, -19, -20, -21, -23, -25, -27, -30, -31, -31, -32, -33, -35, -36, -37, -38, -38, -38, -39, -39, -39, -40, -39, -40, -40, -40, -39, -37, -36, -33, -29, -27, -24, -24, -22, -23, -22, -22, -21, -20, -18, -18, -17, -18, -17, -14, -10, -6, -4, -1, 0, 3, 6, 8, 12, 13, 15, 18, 19, 21, 22, 24, 26, 28, 28, 32, 34, 36, 35, 30, 29, 29, 30, 32, 33, 33, 35, 36, 36, 36, 36, 37, 39, 42, 43, 44, 45, 45, 46, 45, 45, 45, 45, 45, 46, 48, - /* -29.0 */ 48, 47, 46, 35, 23, 30, 31, 31, 28, 26, 23, 21, 19, 17, 15, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 0, -0, -1, -2, -2, -2, -3, -4, -5, -5, -5, -6, -7, -7, -8, -8, -10, -11, -12, -12, -13, -13, -13, -14, -13, -13, -13, -13, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -1, -0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 17, 16, 14, 31, 38, 35, 31, 28, 26, 26, 24, 24, 22, 20, 19, 17, 16, 14, 11, 10, 9, 8, 7, 6, 4, 2, 1, -3, -6, -8, -9, -9, -9, -9, -9, -8, -8, -6, -4, -3, -1, 0, 1, 2, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 14, 15, 15, 15, 15, 15, 16, 17, 18, 18, 19, 20, 21, 22, 24, 24, 23, 24, 24, 24, 25, 25, 26, 26, 27, 28, 30, 32, 31, 32, 32, 32, 31, 31, 32, 32, 31, 31, 31, 31, 34, 35, 29, 27, 25, 19, 18, 18, 18, 13, 12, 11, 11, 12, 12, 11, 13, 15, 15, 15, 15, 13, 11, 10, 10, 11, 11, 11, 10, 10, 10, 11, 11, 10, 11, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, -1, -2, -4, -6, -8, -10, -12, -14, -15, -17, -19, -20, -22, -23, -25, -27, -29, -31, -33, -33, -33, -34, -36, -37, -36, -37, -38, -39, -38, -38, -38, -39, -39, -39, -39, -40, -39, -38, -36, -34, -28, -26, -23, -23, -21, -21, -20, -20, -18, -17, -17, -16, -16, -16, -16, -15, -12, -9, -4, -1, 2, 4, 5, 8, 10, 12, 14, 16, 19, 20, 23, 25, 26, 28, 30, 31, 33, 35, 37, 37, 34, 31, 33, 32, 34, 35, 35, 37, 38, 39, 38, 38, 40, 41, 46, 45, 46, 47, 47, 47, 47, 46, 47, 47, 46, 46, 48, - /* -28.0 */ 48, 49, 48, 41, 25, 30, 35, 32, 30, 27, 24, 22, 19, 17, 15, 13, 12, 10, 9, 7, 6, 5, 4, 2, 1, 0, -0, -1, -1, -1, -2, -3, -4, -4, -5, -5, -4, -5, -6, -8, -9, -11, -11, -12, -13, -13, -13, -14, -14, -13, -13, -13, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -1, -1, -0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 17, 17, 13, 26, 35, 38, 35, 29, 29, 27, 24, 24, 23, 21, 20, 18, 16, 14, 11, 9, 8, 8, 7, 6, 6, 2, 1, -2, -6, -8, -10, -10, -11, -11, -11, -10, -9, -7, -6, -4, -3, -2, -1, -0, -0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14, 14, 14, 15, 15, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 25, 24, 24, 25, 25, 25, 25, 26, 26, 27, 28, 30, 32, 32, 32, 32, 32, 30, 31, 31, 33, 31, 30, 30, 30, 32, 32, 28, 26, 24, 19, 18, 17, 15, 12, 10, 8, 9, 10, 10, 9, 8, 12, 12, 12, 12, 11, 8, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 8, 9, 8, 8, 7, 7, 6, 4, 3, 2, 1, -0, -2, -3, -5, -7, -9, -11, -13, -15, -17, -19, -20, -22, -23, -24, -26, -28, -30, -31, -34, -35, -35, -36, -37, -38, -38, -37, -38, -39, -39, -38, -38, -38, -39, -39, -39, -39, -39, -38, -37, -34, -29, -24, -21, -20, -20, -20, -19, -18, -16, -15, -14, -14, -14, -13, -12, -12, -12, -10, -9, -6, 0, 4, 5, 8, 9, 11, 13, 15, 18, 20, 22, 25, 27, 29, 30, 32, 33, 35, 38, 40, 40, 38, 35, 36, 35, 36, 36, 38, 39, 41, 41, 41, 40, 42, 44, 46, 47, 47, 48, 48, 49, 49, 48, 48, 47, 47, 47, 48, - /* -27.0 */ 48, 50, 49, 45, 29, 31, 34, 33, 31, 28, 25, 22, 19, 17, 15, 13, 12, 10, 9, 7, 7, 5, 4, 2, 2, 0, -0, -1, -1, -1, -2, -3, -4, -4, -4, -4, -5, -6, -7, -9, -10, -11, -12, -12, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 16, 18, 19, 13, 23, 35, 41, 41, 37, 36, 26, 25, 24, 24, 22, 21, 19, 17, 15, 11, 8, 6, 5, 7, 6, 4, 1, 0, -3, -7, -8, -11, -10, -10, -11, -12, -9, -9, -8, -7, -5, -4, -3, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 14, 15, 15, 15, 16, 17, 17, 18, 19, 20, 21, 22, 22, 24, 26, 25, 25, 25, 25, 25, 25, 25, 26, 28, 31, 32, 33, 33, 31, 32, 30, 29, 28, 29, 28, 29, 29, 29, 29, 29, 28, 24, 22, 18, 15, 14, 13, 11, 7, 6, 6, 7, 7, 7, 6, 9, 10, 9, 8, 6, 5, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 5, 6, 6, 6, 5, 3, 3, 1, 0, -1, -2, -4, -6, -8, -10, -12, -14, -16, -18, -19, -21, -23, -24, -26, -27, -27, -29, -32, -34, -36, -37, -38, -39, -39, -40, -40, -40, -40, -40, -39, -39, -38, -38, -38, -38, -38, -38, -38, -37, -34, -30, -26, -23, -20, -18, -18, -18, -17, -15, -14, -13, -12, -11, -10, -10, -8, -7, -5, -2, 0, 0, 1, 4, 7, 9, 12, 14, 16, 18, 20, 22, 24, 26, 29, 32, 34, 35, 36, 38, 41, 43, 43, 39, 37, 37, 37, 38, 41, 41, 42, 43, 44, 44, 43, 45, 46, 48, 49, 50, 50, 50, 50, 50, 50, 49, 48, 48, 47, 48, - /* -26.0 */ 49, 51, 50, 47, 34, 32, 34, 34, 31, 28, 25, 22, 20, 17, 15, 14, 12, 10, 9, 8, 7, 6, 4, 3, 2, 1, 0, -0, -1, -2, -2, -3, -4, -3, -5, -6, -7, -8, -9, -10, -11, -11, -12, -12, -13, -13, -13, -13, -13, -13, -13, -12, -11, -11, -11, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -1, -1, -0, -0, 0, 1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 6, 6, 8, 9, 9, 11, 13, 15, 16, 17, 18, 16, 20, 34, 41, 43, 41, 36, 29, 27, 25, 25, 23, 21, 19, 17, 14, 11, 7, 5, 4, 5, 5, 4, 2, -0, -2, -6, -10, -11, -11, -10, -11, -11, -11, -10, -9, -7, -6, -5, -5, -4, -4, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 14, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 22, 23, 25, 27, 29, 24, 25, 25, 25, 25, 26, 28, 31, 32, 34, 34, 30, 28, 29, 28, 27, 27, 26, 26, 26, 26, 26, 27, 26, 20, 19, 16, 13, 12, 10, 10, 6, 5, 4, 5, 5, 4, 5, 8, 9, 7, 5, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 0, -1, -2, -4, -5, -7, -9, -11, -13, -15, -17, -19, -20, -22, -24, -25, -27, -29, -30, -29, -31, -34, -36, -38, -39, -40, -40, -41, -42, -42, -42, -41, -39, -40, -40, -39, -38, -37, -37, -37, -38, -37, -35, -31, -27, -24, -22, -19, -17, -17, -17, -14, -12, -11, -11, -10, -8, -7, -6, -2, 0, 3, 4, 1, 2, 4, 8, 10, 12, 14, 17, 19, 21, 23, 24, 26, 28, 31, 35, 38, 39, 40, 42, 45, 45, 45, 42, 40, 40, 40, 41, 41, 43, 45, 46, 47, 46, 46, 47, 49, 50, 51, 51, 51, 52, 52, 51, 51, 50, 49, 49, 49, 49, - /* -25.0 */ 50, 51, 51, 50, 39, 28, 34, 34, 31, 28, 25, 22, 19, 17, 15, 14, 12, 10, 10, 9, 8, 7, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -4, -5, -5, -7, -8, -9, -9, -10, -11, -11, -12, -12, -12, -13, -13, -13, -13, -12, -11, -11, -11, -11, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, -0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 8, 8, 8, 10, 11, 12, 14, 17, 18, 19, 16, 18, 36, 38, 41, 43, 39, 29, 27, 26, 25, 23, 21, 19, 17, 13, 10, 6, 4, 3, 2, 3, 4, 2, -1, -2, -3, -6, -10, -12, -11, -12, -11, -11, -9, -9, -8, -7, -7, -6, -6, -6, -5, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 12, 13, 13, 13, 14, 14, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 26, 24, 24, 24, 24, 25, 28, 30, 32, 33, 33, 29, 28, 28, 27, 26, 24, 24, 24, 22, 21, 21, 19, 21, 15, 15, 12, 11, 11, 8, 7, 6, 4, 3, 3, 3, 2, 5, 8, 9, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -0, -0, -1, -2, -3, -4, -5, -6, -8, -10, -12, -14, -16, -18, -20, -22, -24, -25, -27, -28, -30, -32, -33, -32, -33, -36, -38, -39, -41, -41, -42, -43, -43, -43, -43, -43, -42, -41, -40, -39, -38, -38, -37, -37, -35, -34, -34, -30, -25, -22, -21, -18, -16, -16, -15, -12, -9, -7, -6, -7, -6, -4, -3, -3, 0, 2, 3, 3, 5, 7, 10, 13, 16, 19, 21, 24, 26, 27, 28, 29, 32, 34, 38, 41, 44, 46, 46, 47, 47, 47, 43, 43, 41, 43, 44, 44, 48, 47, 48, 49, 48, 48, 49, 51, 53, 54, 53, 52, 53, 53, 52, 52, 51, 50, 49, 49, 50, - /* -24.0 */ 50, 52, 52, 51, 45, 24, 32, 33, 31, 28, 25, 22, 20, 17, 15, 14, 12, 11, 11, 10, 8, 7, 6, 4, 3, 2, 1, 0, -1, -2, -4, -4, -4, -5, -6, -8, -8, -9, -9, -10, -11, -11, -12, -12, -12, -13, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -8, -7, -7, -6, -6, -5, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 6, 6, 8, 8, 9, 11, 12, 14, 16, 18, 19, 17, 17, 32, 34, 40, 43, 43, 31, 27, 24, 24, 23, 20, 18, 16, 13, 9, 5, 2, 1, -1, -0, -0, -1, -3, -2, -3, -4, -6, -8, -9, -10, -12, -11, -10, -9, -9, -8, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -2, -1, 0, 2, 3, 4, 5, 7, 8, 9, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 25, 23, 23, 23, 23, 25, 28, 29, 31, 33, 32, 29, 27, 26, 26, 24, 23, 22, 21, 19, 17, 19, 18, 15, 11, 12, 9, 8, 9, 6, 4, 4, 3, 2, 2, 1, -0, 5, 7, 8, 6, 2, -1, -2, -2, -1, -1, -1, -1, -0, -1, -2, -2, -2, -1, -1, -2, -2, -3, -3, -4, -5, -6, -8, -9, -11, -13, -15, -17, -19, -22, -23, -25, -27, -29, -30, -31, -33, -34, -35, -35, -36, -38, -41, -42, -43, -43, -43, -44, -44, -44, -45, -44, -43, -42, -41, -40, -39, -37, -37, -35, -32, -32, -33, -30, -25, -21, -19, -16, -13, -11, -10, -8, -5, -4, -4, -4, -3, -1, 0, 2, 3, 4, 3, 5, 7, 10, 13, 17, 22, 24, 26, 28, 31, 32, 32, 33, 35, 38, 42, 46, 47, 48, 49, 49, 49, 48, 45, 44, 46, 47, 46, 47, 48, 49, 51, 50, 50, 50, 51, 54, 55, 55, 54, 53, 53, 54, 54, 53, 52, 51, 50, 50, 50, - /* -23.0 */ 50, 52, 52, 52, 51, 29, 28, 31, 30, 28, 25, 23, 20, 18, 16, 14, 13, 12, 11, 10, 9, 8, 6, 5, 3, 3, 2, 1, -1, -1, -3, -4, -5, -7, -7, -8, -8, -9, -9, -10, -10, -11, -11, -11, -12, -11, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -9, -8, -8, -7, -6, -6, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -0, 0, 0, 1, 1, 2, 2, 3, 4, 4, 6, 7, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 15, 33, 36, 40, 44, 43, 37, 25, 24, 23, 21, 19, 18, 16, 13, 9, 5, -0, -2, -3, -4, -5, -5, -5, -4, -2, -3, -4, -6, -6, -6, -11, -11, -10, -9, -9, -8, -8, -7, -7, -6, -6, -6, -6, -6, -5, -4, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 22, 23, 25, 26, 25, 24, 22, 22, 23, 24, 28, 29, 30, 32, 32, 30, 27, 25, 23, 22, 21, 19, 18, 17, 16, 15, 15, 14, 12, 10, 6, 6, 6, 3, 1, 0, 1, -0, -0, -1, -1, 3, 4, 6, 3, 1, -3, -4, -5, -4, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -5, -6, -7, -8, -9, -11, -13, -14, -17, -18, -21, -23, -25, -27, -28, -30, -32, -33, -35, -36, -37, -38, -38, -38, -41, -43, -43, -44, -45, -45, -45, -45, -46, -46, -45, -44, -43, -41, -39, -37, -37, -36, -34, -32, -31, -32, -31, -27, -21, -16, -13, -10, -9, -7, -5, -5, -2, -0, 1, 2, 3, 4, 6, 8, 9, 11, 13, 15, 19, 22, 24, 26, 28, 30, 33, 36, 37, 37, 37, 39, 42, 46, 49, 50, 50, 51, 51, 51, 50, 50, 48, 48, 49, 48, 50, 51, 52, 52, 52, 52, 52, 53, 57, 58, 57, 52, 49, 50, 50, 52, 53, 54, 52, 51, 50, 50, - /* -22.0 */ 50, 52, 52, 53, 52, 44, 26, 30, 30, 28, 26, 23, 21, 18, 15, 14, 13, 12, 11, 11, 10, 9, 8, 5, 4, 4, 2, 1, -0, -1, -3, -4, -5, -6, -6, -7, -8, -9, -9, -9, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -9, -8, -7, -7, -6, -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, 0, 1, 1, 2, 2, 3, 4, 6, 6, 7, 8, 9, 10, 11, 13, 16, 17, 19, 20, 15, 33, 37, 43, 44, 42, 39, 27, 23, 21, 21, 20, 18, 16, 14, 9, 4, -1, -3, -4, -6, -6, -7, -6, -5, -3, -3, -4, -5, -5, -6, -8, -10, -10, -10, -10, -9, -8, -7, -6, -6, -6, -6, -6, -6, -6, -5, -5, -3, -2, -1, 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 17, 17, 18, 19, 21, 22, 23, 24, 25, 24, 23, 22, 23, 24, 27, 28, 29, 30, 31, 29, 27, 25, 21, 19, 19, 18, 16, 16, 14, 13, 11, 10, 10, 8, 4, 3, 2, -1, -2, -3, -2, -2, -3, -3, -2, 0, 0, 4, 3, -0, -5, -7, -7, -7, -6, -5, -4, -4, -6, -6, -5, -5, -6, -6, -6, -7, -7, -8, -9, -10, -12, -14, -16, -18, -20, -22, -24, -26, -28, -30, -32, -33, -35, -37, -38, -39, -39, -40, -40, -40, -44, -45, -45, -46, -46, -46, -46, -46, -47, -47, -47, -45, -44, -42, -40, -35, -34, -36, -33, -31, -31, -31, -29, -27, -22, -15, -12, -9, -7, -7, -6, -2, 0, 3, 5, 5, 5, 7, 10, 13, 14, 15, 16, 19, 21, 25, 27, 30, 31, 34, 37, 40, 41, 41, 42, 43, 46, 49, 51, 52, 54, 53, 53, 54, 53, 52, 51, 51, 52, 51, 54, 52, 54, 54, 54, 53, 53, 59, 60, 58, 54, 51, 60, 61, 60, 58, 57, 54, 53, 51, 50, 50, - /* -21.0 */ 50, 52, 52, 53, 53, 52, 35, 27, 30, 28, 26, 23, 20, 18, 16, 14, 14, 12, 12, 11, 11, 9, 7, 6, 5, 4, 2, 1, 0, -0, -2, -3, -4, -5, -6, -7, -8, -8, -9, -9, -10, -10, -10, -10, -11, -11, -11, -12, -12, -12, -12, -12, -11, -11, -10, -10, -9, -8, -7, -6, -6, -5, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, 0, 1, 1, 2, 3, 4, 6, 8, 8, 9, 10, 12, 14, 16, 18, 20, 20, 16, 32, 38, 43, 42, 43, 40, 29, 22, 23, 21, 21, 18, 16, 14, 9, 4, -1, -4, -6, -7, -7, -7, -7, -6, -5, -4, -4, -5, -6, -6, -8, -11, -9, -10, -8, -6, -5, -6, -5, -6, -6, -6, -7, -6, -6, -6, -5, -4, -3, -2, -0, 1, 3, 4, 6, 7, 8, 10, 12, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 20, 22, 22, 23, 23, 23, 22, 23, 25, 26, 25, 27, 29, 28, 29, 28, 24, 21, 18, 18, 16, 15, 14, 13, 12, 10, 8, 5, 4, 3, 0, -2, -4, -5, -5, -6, -7, -6, -6, -5, -4, -3, 0, 3, -1, -6, -9, -9, -9, -9, -8, -1, -2, -10, -9, -8, -7, -8, -8, -9, -9, -10, -11, -12, -13, -15, -17, -19, -22, -23, -26, -28, -30, -32, -34, -35, -37, -39, -40, -41, -42, -42, -43, -43, -43, -46, -46, -46, -47, -48, -47, -47, -47, -47, -48, -47, -46, -44, -42, -39, -37, -35, -35, -33, -31, -30, -28, -27, -24, -22, -18, -12, -9, -8, -6, -3, 1, 4, 6, 7, 8, 9, 11, 14, 16, 17, 20, 22, 24, 26, 28, 31, 32, 34, 36, 40, 44, 44, 43, 44, 47, 50, 53, 54, 55, 55, 56, 55, 56, 56, 53, 52, 54, 54, 54, 57, 54, 57, 57, 54, 54, 62, 60, 60, 57, 50, 62, 64, 64, 63, 62, 60, 59, 54, 53, 51, 50, - /* -20.0 */ 50, 51, 51, 51, 52, 52, 43, 24, 29, 29, 26, 23, 21, 18, 16, 15, 13, 12, 11, 10, 9, 9, 10, 7, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -6, -6, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -11, -11, -11, -10, -10, -9, -8, -8, -7, -6, -6, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -2, -2, -1, -1, -0, 0, 1, 1, 2, 3, 5, 7, 8, 9, 11, 13, 15, 16, 18, 20, 19, 16, 34, 42, 43, 43, 44, 42, 30, 23, 24, 22, 20, 18, 16, 14, 9, 4, -1, -5, -7, -8, -8, -8, -9, -8, -8, -7, -6, -10, -6, -6, -7, -10, -7, -9, -7, -8, -7, -6, -5, -6, -6, -6, -7, -7, -7, -6, -6, -5, -3, -2, -1, 1, 3, 4, 6, 7, 8, 10, 12, 12, 12, 12, 13, 13, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 20, 21, 21, 23, 23, 24, 25, 25, 25, 26, 26, 26, 25, 23, 22, 19, 16, 15, 14, 13, 11, 11, 10, 10, 7, 5, 1, 1, -1, -4, -4, -9, -11, -9, -10, -10, -9, -8, -7, -6, -2, 1, -1, -7, -11, -11, -11, -11, -11, -11, -12, -12, -7, -12, -10, -11, -11, -11, -12, -12, -13, -15, -16, -18, -21, -23, -25, -27, -29, -32, -33, -35, -37, -39, -40, -42, -44, -45, -46, -47, -46, -45, -45, -48, -48, -48, -48, -48, -49, -48, -48, -48, -48, -47, -46, -44, -42, -40, -37, -35, -34, -32, -30, -28, -26, -24, -22, -19, -17, -12, -7, -6, -3, 1, 4, 8, 9, 10, 11, 14, 16, 18, 21, 23, 24, 24, 25, 28, 31, 33, 34, 37, 39, 43, 46, 45, 45, 48, 52, 55, 56, 57, 57, 57, 57, 57, 58, 56, 54, 55, 55, 55, 56, 58, 57, 58, 56, 56, 60, 59, 61, 58, 51, 55, 64, 65, 65, 64, 63, 61, 59, 57, 52, 51, 50, - /* -19.0 */ 51, 50, 51, 51, 51, 50, 47, 26, 29, 29, 29, 25, 21, 18, 16, 14, 12, 12, 11, 10, 10, 9, 8, 6, 5, 4, 3, 2, 2, 2, 1, -0, -2, -3, -5, -6, -6, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -10, -10, -9, -9, -8, -7, -7, -6, -5, -5, -4, -4, -3, -3, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -4, -4, -4, -4, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -1, -1, -0, 1, 2, 3, 4, 6, 8, 10, 12, 13, 15, 17, 19, 21, 14, 20, 35, 44, 43, 44, 43, 39, 30, 22, 23, 22, 19, 17, 16, 12, 8, 4, -2, -5, -7, -8, -8, -11, -11, -9, -9, -10, -10, -11, -11, -9, -8, -7, -8, -11, -9, -8, -7, -6, -5, -5, -5, -6, -6, -7, -7, -7, -6, -5, -3, -2, -0, 1, 3, 5, 6, 7, 8, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 16, 16, 16, 16, 17, 17, 18, 19, 19, 19, 19, 20, 22, 24, 24, 26, 25, 23, 22, 22, 21, 20, 17, 14, 13, 12, 11, 10, 8, 6, 6, 6, 6, 2, -2, -5, -6, -7, -7, -11, -12, -13, -12, -11, -10, -10, -8, -3, -1, -2, -7, -13, -13, -14, -13, -13, -14, -15, -12, -10, -13, -13, -14, -15, -16, -15, -16, -17, -18, -20, -22, -25, -27, -29, -31, -34, -36, -37, -39, -41, -42, -44, -45, -47, -49, -49, -50, -51, -48, -47, -51, -51, -51, -50, -49, -50, -49, -49, -48, -47, -46, -45, -44, -42, -40, -37, -35, -33, -31, -29, -27, -24, -22, -20, -17, -15, -14, -7, -4, -0, 4, 8, 10, 11, 13, 16, 18, 20, 22, 24, 27, 29, 28, 29, 31, 34, 36, 37, 40, 42, 45, 47, 48, 49, 52, 56, 58, 59, 58, 58, 58, 58, 58, 59, 57, 57, 57, 58, 57, 56, 58, 58, 57, 57, 59, 59, 61, 60, 58, 53, 64, 66, 66, 65, 64, 63, 61, 59, 57, 55, 51, 51, - /* -18.0 */ 50, 51, 50, 49, 49, 48, 47, 33, 26, 29, 27, 25, 21, 18, 16, 14, 13, 13, 11, 10, 9, 8, 7, 7, 6, 4, 5, 3, 3, 3, 3, 3, -0, -3, -4, -4, -6, -7, -6, -7, -8, -9, -9, -10, -10, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -4, -4, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, -0, 1, 2, 4, 5, 8, 10, 12, 14, 16, 17, 17, 13, 18, 27, 38, 44, 44, 45, 41, 38, 30, 22, 22, 22, 21, 16, 13, 10, 6, 2, -1, -3, -6, -8, -9, -13, -13, -11, -12, -12, -11, -11, -10, -10, -9, -8, -6, -11, -7, -9, -8, -7, -6, -6, -6, -6, -7, -7, -7, -7, -6, -5, -3, -1, -0, 2, 3, 5, 6, 7, 8, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 17, 18, 17, 17, 18, 20, 22, 25, 26, 24, 21, 20, 19, 18, 17, 14, 12, 11, 10, 9, 8, 4, 3, 2, 3, 4, 2, -4, -8, -10, -10, -9, -11, -13, -14, -15, -14, -14, -11, -10, -7, -5, -5, -7, -13, -15, -16, -16, -16, -16, -16, -17, -17, -16, -16, -16, -17, -18, -19, -20, -21, -22, -24, -26, -29, -31, -33, -36, -38, -40, -41, -42, -44, -45, -47, -49, -50, -52, -53, -52, -54, -52, -48, -53, -53, -52, -52, -51, -50, -51, -49, -48, -47, -45, -44, -43, -41, -39, -36, -34, -32, -30, -27, -25, -22, -19, -17, -14, -12, -10, -7, -5, 0, 6, 8, 12, 14, 17, 20, 22, 24, 27, 28, 29, 32, 32, 33, 35, 37, 39, 41, 44, 45, 48, 50, 50, 51, 54, 57, 60, 60, 59, 58, 59, 60, 60, 60, 59, 59, 60, 60, 59, 57, 59, 58, 58, 59, 61, 60, 60, 60, 57, 58, 65, 67, 66, 65, 64, 63, 61, 59, 57, 56, 53, 50, - /* -17.0 */ 51, 50, 49, 48, 47, 46, 45, 36, 24, 28, 27, 24, 20, 17, 16, 14, 12, 12, 11, 10, 9, 8, 7, 7, 6, 6, 5, 4, 5, 5, 3, 1, -1, -3, -2, -3, -3, -4, -6, -7, -7, -8, -9, -10, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -3, -3, -3, -3, -3, -4, -4, -5, -5, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -4, -4, -3, -3, -2, -1, -0, 1, 3, 5, 7, 10, 13, 15, 16, 14, 12, 19, 30, 39, 45, 45, 44, 43, 36, 25, 21, 23, 22, 22, 19, 14, 10, 7, 4, 1, -1, -3, -4, -7, -9, -12, -12, -13, -15, -15, -12, -12, -11, -10, -9, -8, -12, -10, -10, -9, -8, -8, -7, -7, -6, -7, -7, -8, -8, -7, -6, -4, -2, -1, 0, 2, 4, 5, 6, 7, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 17, 18, 21, 22, 23, 24, 22, 21, 19, 18, 17, 15, 13, 11, 10, 9, 7, 7, 7, -0, -1, 1, 1, -3, -9, -11, -11, -11, -12, -13, -13, -15, -18, -17, -16, -14, -12, -13, -11, -8, -9, -13, -17, -17, -18, -18, -17, -17, -19, -19, -17, -17, -20, -21, -22, -23, -24, -24, -26, -28, -30, -33, -35, -38, -40, -42, -44, -45, -46, -47, -49, -50, -52, -54, -55, -56, -57, -56, -54, -51, -55, -54, -54, -53, -52, -49, -51, -49, -48, -46, -44, -42, -42, -40, -37, -35, -33, -31, -28, -25, -22, -20, -17, -14, -10, -9, -6, -6, -4, -0, 7, 12, 16, 19, 22, 24, 26, 29, 31, 33, 31, 33, 35, 36, 38, 39, 43, 45, 45, 48, 50, 52, 52, 54, 57, 59, 61, 62, 59, 60, 61, 63, 63, 63, 61, 61, 61, 61, 60, 60, 60, 59, 58, 60, 59, 60, 60, 60, 58, 62, 66, 66, 66, 65, 63, 62, 61, 59, 58, 55, 54, 51, - /* -16.0 */ 52, 49, 48, 46, 45, 44, 42, 34, 22, 28, 26, 23, 20, 17, 16, 14, 12, 12, 11, 10, 9, 8, 7, 7, 7, 6, 6, 5, 5, 4, 2, 1, -1, 1, -0, -2, -4, -5, -5, -5, -6, -8, -9, -10, -10, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -4, -5, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -5, -4, -4, -3, -3, -2, -1, 0, 2, 5, 7, 10, 13, 15, 13, 15, 30, 38, 42, 45, 45, 46, 41, 32, 25, 22, 22, 24, 22, 21, 17, 13, 9, 5, 2, -0, -2, -4, -5, -6, -8, -11, -13, -13, -14, -14, -13, -12, -11, -9, -9, -8, -9, -14, -11, -9, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -6, -4, -3, -2, -0, 2, 3, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 13, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 20, 23, 24, 24, 22, 20, 18, 17, 16, 14, 12, 10, 8, 7, 7, 5, 3, 2, -3, -5, -9, -8, -10, -12, -11, -10, -14, -15, -16, -15, -22, -20, -21, -19, -18, -18, -17, -13, -10, -14, -18, -19, -20, -20, -19, -20, -21, -22, -20, -19, -21, -25, -26, -27, -27, -28, -29, -32, -34, -37, -40, -42, -45, -46, -48, -50, -50, -51, -52, -54, -55, -57, -58, -59, -59, -58, -57, -54, -57, -56, -56, -54, -53, -52, -50, -49, -46, -45, -43, -40, -40, -37, -35, -33, -31, -28, -25, -22, -19, -18, -15, -11, -9, -8, -6, -3, -1, 2, 8, 14, 20, 22, 25, 27, 29, 33, 34, 35, 34, 35, 37, 39, 41, 43, 45, 47, 49, 50, 51, 52, 54, 56, 59, 62, 63, 62, 61, 63, 63, 64, 64, 63, 61, 61, 61, 62, 63, 62, 62, 61, 61, 60, 60, 59, 61, 60, 62, 64, 66, 66, 65, 64, 62, 61, 59, 58, 56, 54, 53, 52, - /* -15.0 */ 49, 48, 46, 45, 44, 42, 38, 27, 27, 29, 26, 23, 20, 17, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 6, 6, 5, 3, 2, 1, 1, 2, 0, -2, -3, -4, -5, -5, -6, -7, -8, -9, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -4, -4, -3, -3, -3, -3, -3, -4, -4, -5, -5, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -5, -5, -4, -4, -3, -2, -0, 2, 4, 7, 10, 12, 11, 15, 30, 38, 44, 46, 47, 47, 45, 33, 27, 27, 26, 25, 22, 20, 19, 16, 13, 8, 3, -0, -2, -4, -5, -6, -7, -9, -12, -14, -15, -14, -13, -13, -13, -11, -10, -11, -8, -13, -14, -12, -11, -9, -8, -8, -7, -7, -7, -7, -7, -7, -6, -5, -4, -3, -2, -0, 1, 3, 5, 6, 7, 9, 10, 10, 10, 11, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 18, 21, 22, 24, 22, 20, 18, 16, 15, 13, 11, 9, 7, 5, 4, 3, 2, -0, -3, -8, -9, -10, -11, -10, -12, -14, -16, -18, -19, -20, -23, -21, -23, -24, -26, -23, -20, -18, -14, -15, -19, -22, -22, -23, -22, -22, -23, -24, -27, -24, -24, -28, -29, -30, -31, -32, -33, -36, -38, -41, -43, -46, -49, -51, -52, -53, -54, -55, -56, -57, -58, -59, -60, -61, -61, -58, -56, -56, -59, -58, -57, -55, -54, -53, -49, -48, -44, -43, -41, -40, -37, -34, -32, -31, -28, -25, -22, -18, -15, -14, -12, -8, -5, -3, -1, 1, 4, 6, 10, 15, 21, 26, 28, 30, 32, 35, 37, 37, 37, 39, 41, 43, 45, 47, 48, 51, 53, 52, 52, 54, 56, 58, 61, 64, 65, 63, 63, 64, 64, 63, 62, 61, 62, 62, 63, 63, 63, 64, 63, 64, 62, 61, 62, 63, 59, 54, 62, 64, 65, 65, 64, 63, 61, 59, 58, 56, 55, 53, 51, 49, - /* -14.0 */ 47, 46, 44, 43, 38, 36, 32, 31, 33, 30, 29, 24, 19, 17, 16, 14, 13, 13, 12, 10, 9, 8, 7, 7, 6, 6, 5, 4, 3, 2, 3, 1, -1, -2, -3, -3, -4, -5, -6, -6, -7, -7, -8, -9, -9, -9, -10, -10, -10, -9, -10, -9, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -4, -4, -4, -4, -5, -5, -6, -6, -7, -8, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -6, -6, -5, -5, -4, -3, -2, -1, 1, 4, 6, 9, 9, 12, 24, 38, 37, 40, 45, 49, 44, 34, 31, 29, 29, 28, 25, 21, 19, 18, 15, 12, 10, 4, -2, -4, -6, -8, -9, -10, -10, -11, -15, -17, -14, -13, -13, -13, -14, -12, -10, -9, -12, -13, -12, -11, -10, -9, -8, -7, -7, -7, -7, -7, -7, -6, -5, -4, -3, -1, 0, 2, 4, 5, 6, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 14, 15, 15, 16, 17, 19, 21, 22, 22, 21, 18, 16, 14, 12, 9, 6, 5, 4, 3, 1, -0, -2, -5, -7, -11, -11, -12, -11, -16, -17, -19, -20, -20, -22, -24, -23, -25, -26, -27, -25, -24, -18, -16, -16, -22, -24, -24, -25, -25, -25, -26, -27, -29, -29, -27, -31, -32, -34, -35, -36, -37, -40, -42, -45, -47, -50, -53, -55, -56, -58, -59, -60, -60, -61, -62, -62, -62, -64, -64, -63, -61, -60, -60, -59, -59, -56, -55, -53, -50, -46, -42, -41, -40, -38, -35, -30, -28, -27, -25, -21, -17, -14, -9, -10, -8, -4, -1, 1, 3, 6, 8, 10, 14, 19, 22, 27, 29, 32, 34, 36, 38, 39, 42, 42, 45, 48, 50, 51, 52, 54, 55, 55, 55, 57, 59, 62, 64, 66, 65, 64, 65, 64, 62, 62, 63, 63, 63, 64, 65, 66, 65, 64, 64, 65, 64, 64, 63, 62, 62, 52, 57, 65, 64, 64, 63, 61, 59, 58, 56, 54, 53, 51, 50, 47, - /* -13.0 */ 41, 44, 41, 36, 36, 34, 32, 29, 28, 25, 24, 21, 19, 17, 15, 14, 13, 14, 13, 12, 10, 9, 8, 7, 7, 6, 4, 4, 3, 2, 1, 0, -0, -1, -3, -3, -4, -4, -5, -5, -6, -6, -7, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5, -6, -7, -7, -8, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -4, -2, -1, 1, 4, 6, 6, 7, 17, 32, 36, 34, 36, 41, 37, 31, 30, 31, 31, 29, 27, 24, 21, 19, 17, 13, 12, 11, 5, -2, -5, -8, -8, -8, -11, -12, -12, -16, -18, -14, -13, -14, -16, -13, -12, -11, -11, -11, -12, -13, -12, -10, -9, -8, -8, -8, -8, -8, -7, -7, -6, -5, -4, -3, -1, 1, 2, 4, 5, 7, 9, 9, 9, 10, 10, 10, 11, 12, 12, 14, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 15, 16, 17, 18, 22, 21, 22, 22, 18, 15, 13, 11, 8, 5, 4, 2, 1, 0, -2, -5, -5, -6, -10, -14, -12, -15, -19, -17, -21, -22, -21, -22, -25, -27, -28, -27, -22, -27, -27, -21, -18, -21, -26, -26, -27, -28, -27, -28, -29, -30, -32, -34, -31, -34, -36, -37, -38, -39, -42, -44, -46, -49, -51, -54, -57, -59, -60, -62, -64, -64, -64, -64, -65, -65, -65, -66, -67, -65, -66, -63, -60, -61, -59, -57, -56, -53, -48, -43, -42, -40, -38, -37, -31, -26, -24, -22, -19, -17, -13, -10, -6, -4, -3, 1, 3, 5, 7, 11, 12, 15, 18, 23, 26, 29, 32, 35, 36, 37, 39, 42, 44, 46, 49, 52, 54, 55, 56, 57, 58, 58, 59, 60, 61, 64, 67, 65, 64, 66, 65, 65, 65, 64, 64, 64, 64, 65, 67, 68, 68, 66, 66, 64, 65, 64, 63, 62, 59, 48, 59, 62, 62, 62, 60, 59, 57, 56, 54, 52, 50, 48, 46, 41, - /* -12.0 */ 43, 41, 39, 35, 34, 31, 31, 27, 26, 25, 23, 20, 18, 17, 15, 15, 14, 14, 14, 13, 10, 9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 1, 0, -0, -2, -2, -4, -4, -5, -5, -5, -5, -5, -6, -7, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -7, -8, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -6, -5, -4, -3, -2, -1, 1, 3, 4, 2, 10, 24, 32, 33, 31, 31, 31, 28, 27, 29, 29, 30, 27, 23, 21, 19, 18, 15, 11, 9, 8, 2, -5, -8, -10, -9, -11, -14, -16, -14, -15, -17, -16, -16, -16, -16, -13, -12, -12, -12, -11, -12, -13, -12, -11, -9, -9, -9, -9, -9, -8, -8, -7, -6, -5, -4, -2, -0, 2, 3, 5, 6, 7, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 12, 12, 13, 14, 15, 16, 17, 17, 19, 21, 22, 21, 19, 15, 12, 10, 7, 5, 3, 1, -0, -2, -3, -5, -7, -9, -10, -13, -13, -16, -19, -19, -23, -24, -24, -23, -26, -27, -26, -24, -27, -28, -29, -25, -24, -26, -29, -29, -30, -30, -30, -31, -32, -33, -35, -37, -34, -36, -39, -41, -42, -44, -46, -48, -51, -53, -55, -58, -61, -63, -64, -66, -68, -68, -68, -68, -68, -69, -68, -68, -69, -68, -67, -65, -62, -63, -59, -58, -56, -52, -48, -44, -39, -38, -36, -33, -28, -24, -21, -17, -14, -13, -9, -7, -3, 0, 3, 6, 7, 8, 10, 13, 15, 17, 21, 23, 25, 30, 35, 37, 38, 41, 43, 45, 46, 49, 52, 54, 56, 57, 59, 60, 61, 62, 62, 62, 63, 67, 69, 68, 67, 68, 67, 67, 65, 65, 66, 66, 66, 67, 65, 67, 68, 67, 63, 67, 64, 62, 61, 60, 56, 46, 58, 61, 60, 60, 58, 57, 53, 52, 50, 49, 46, 46, 42, 43, - /* -11.0 */ 39, 38, 34, 33, 31, 29, 28, 27, 26, 24, 22, 20, 19, 17, 17, 15, 15, 15, 15, 12, 11, 9, 8, 8, 7, 6, 6, 5, 5, 4, 3, 3, 2, 1, -0, -2, -2, -3, -3, -4, -4, -4, -4, -5, -6, -7, -7, -8, -8, -9, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -7, -7, -8, -9, -9, -10, -10, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -9, -8, -7, -6, -5, -4, -2, -1, 1, 2, -0, 2, 15, 27, 32, 31, 29, 28, 26, 27, 28, 28, 27, 27, 24, 21, 19, 18, 15, 11, 7, 2, -2, -4, -9, -10, -10, -11, -12, -16, -19, -17, -16, -16, -16, -17, -17, -16, -16, -13, -12, -13, -12, -10, -10, -12, -11, -11, -10, -10, -9, -9, -8, -8, -7, -6, -5, -3, -1, 1, 2, 4, 6, 7, 8, 10, 11, 12, 11, 11, 11, 11, 12, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 11, 11, 12, 13, 14, 14, 15, 17, 18, 18, 20, 19, 16, 13, 10, 8, 6, 4, 1, -1, -1, -3, -4, -6, -9, -10, -11, -12, -14, -15, -17, -18, -22, -25, -24, -24, -27, -27, -29, -29, -30, -31, -30, -31, -30, -30, -31, -30, -31, -32, -32, -33, -34, -36, -37, -38, -36, -38, -42, -45, -47, -48, -50, -52, -55, -57, -58, -62, -65, -67, -69, -70, -71, -72, -72, -72, -72, -72, -72, -70, -70, -70, -68, -67, -63, -65, -60, -57, -55, -52, -48, -44, -39, -37, -33, -29, -26, -23, -19, -14, -8, -8, -7, -5, -2, -0, 3, 5, 5, 4, 7, 11, 13, 16, 18, 23, 27, 29, 30, 31, 37, 42, 46, 48, 49, 52, 55, 57, 59, 59, 60, 62, 63, 64, 66, 66, 67, 69, 72, 72, 70, 70, 69, 68, 69, 72, 75, 74, 74, 72, 70, 65, 69, 68, 65, 64, 58, 62, 56, 55, 52, 54, 58, 59, 57, 56, 52, 51, 49, 46, 45, 43, 41, 40, 39, 39, - /* -10.0 */ 35, 33, 31, 30, 29, 27, 27, 26, 25, 22, 21, 20, 18, 17, 16, 15, 16, 15, 14, 13, 11, 10, 8, 8, 7, 7, 7, 6, 6, 5, 5, 4, 2, 2, 0, -1, -1, -2, -2, -3, -3, 1, -2, -4, -5, -6, -7, -7, -8, -9, -9, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -9, -9, -8, -8, -8, -8, -8, -8, -9, -9, -10, -11, -11, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -9, -8, -7, -6, -5, -4, -2, -1, 1, 0, -1, 9, 20, 24, 28, 27, 23, 26, 26, 27, 27, 26, 25, 23, 21, 18, 16, 14, 11, 7, 3, -1, -4, -4, -7, -10, -12, -12, -13, -15, -19, -19, -19, -19, -17, -16, -15, -17, -17, -14, -12, -12, -11, -9, -9, -12, -11, -11, -11, -10, -10, -9, -8, -7, -7, -6, -4, -3, -1, 2, 4, 5, 7, 8, 9, 10, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 10, 10, 10, 10, 10, 10, 11, 11, 12, 13, 14, 15, 17, 17, 17, 16, 13, 11, 8, 6, 4, 2, -2, -4, -5, -5, -7, -6, -9, -13, -12, -11, -12, -17, -15, -19, -22, -23, -24, -27, -31, -30, -32, -32, -33, -33, -34, -33, -33, -32, -30, -32, -33, -33, -34, -35, -36, -38, -39, -38, -39, -42, -46, -49, -51, -52, -54, -56, -59, -61, -63, -65, -68, -71, -73, -74, -75, -76, -76, -76, -75, -75, -75, -74, -71, -70, -69, -68, -65, -65, -60, -58, -54, -52, -47, -43, -39, -35, -32, -27, -23, -21, -16, -11, -6, -5, -8, -7, -4, -2, 1, 5, 10, 10, 11, 14, 16, 19, 27, 36, 34, 27, 27, 33, 33, 36, 42, 47, 50, 52, 55, 58, 60, 61, 63, 65, 64, 66, 68, 69, 70, 72, 74, 74, 71, 69, 69, 75, 78, 78, 77, 74, 73, 73, 71, 70, 67, 66, 63, 63, 63, 58, 60, 60, 58, 58, 57, 56, 54, 51, 50, 47, 44, 43, 41, 39, 38, 36, 35, 35, - /* -9.0 */ 32, 29, 29, 27, 26, 25, 24, 24, 23, 22, 20, 19, 17, 17, 16, 15, 15, 15, 13, 12, 11, 9, 12, 9, 8, 8, 8, 7, 7, 7, 5, 5, 3, 2, 1, 0, 0, -0, -1, -0, 2, -2, -3, -3, -4, -6, -7, -8, -8, -9, -10, -10, -10, -11, -11, -11, -11, -12, -12, -12, -13, -13, -12, -12, -12, -11, -11, -10, -10, -9, -9, -9, -9, -9, -10, -10, -11, -12, -12, -12, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -10, -9, -8, -7, -5, -4, -2, -0, 0, -2, 6, 14, 19, 19, 18, 19, 21, 25, 25, 26, 26, 24, 23, 20, 17, 14, 12, 11, 8, 4, 1, -3, -5, -8, -10, -13, -15, -16, -16, -17, -21, -22, -21, -21, -20, -19, -18, -16, -14, -14, -12, -11, -9, -8, -7, -8, -11, -11, -11, -10, -10, -9, -8, -7, -6, -5, -4, -2, -0, 2, 4, 6, 8, 9, 10, 12, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 12, 10, 10, 9, 9, 9, 9, 9, 10, 10, 11, 11, 13, 16, 16, 15, 13, 10, 8, 6, 4, 2, -0, -3, -6, -8, -10, -9, -8, -12, -14, -13, -11, -12, -14, -13, -19, -21, -24, -25, -31, -33, -33, -34, -35, -35, -37, -34, -38, -35, -34, -34, -34, -36, -35, -36, -37, -38, -40, -41, -40, -44, -46, -49, -52, -54, -56, -58, -60, -63, -64, -66, -69, -72, -75, -76, -78, -79, -80, -80, -79, -78, -77, -77, -76, -74, -72, -70, -68, -65, -65, -60, -58, -55, -50, -46, -42, -37, -32, -30, -25, -21, -17, -13, -10, -9, -9, -6, -3, 1, 7, 11, 16, 21, 24, 27, 31, 35, 33, 36, 40, 37, 35, 32, 37, 42, 42, 37, 34, 41, 46, 52, 56, 60, 62, 65, 67, 66, 67, 69, 70, 71, 73, 75, 74, 74, 71, 77, 82, 78, 78, 78, 77, 74, 73, 71, 70, 69, 67, 63, 62, 62, 54, 60, 59, 56, 56, 54, 52, 49, 48, 45, 43, 42, 41, 39, 38, 36, 35, 33, 32, - /* -8.0 */ 29, 27, 26, 25, 24, 22, 21, 21, 20, 20, 19, 18, 17, 17, 17, 16, 15, 15, 14, 12, 12, 10, 10, 10, 9, 9, 9, 9, 8, 8, 6, 5, 4, 3, 2, 2, 2, 1, 0, 3, 1, -1, -2, -3, -4, -5, -6, -8, -8, -9, -10, -10, -11, -12, -12, -12, -13, -13, -13, -14, -13, -13, -13, -13, -13, -13, -12, -12, -11, -11, -11, -10, -10, -10, -11, -11, -11, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -11, -10, -9, -8, -7, -5, -4, -2, -0, -0, -2, 9, 15, 20, 13, 12, 15, 21, 23, 24, 26, 24, 22, 20, 18, 15, 11, 10, 8, 4, 1, -1, -4, -7, -10, -14, -16, -18, -19, -19, -20, -22, -23, -23, -23, -23, -23, -22, -19, -16, -13, -11, -10, -8, -6, -5, -5, -10, -11, -11, -11, -9, -8, -8, -7, -6, -5, -4, -2, 0, 2, 4, 6, 8, 10, 11, 12, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 13, 10, 10, 9, 9, 8, 8, 8, 9, 9, 10, 11, 13, 13, 12, 10, 7, 6, 4, 1, -1, -3, -5, -7, -8, -12, -14, -11, -12, -11, -14, -14, -15, -17, -15, -17, -22, -25, -27, -29, -34, -35, -36, -37, -38, -40, -36, -40, -38, -36, -37, -36, -37, -38, -38, -39, -41, -42, -43, -44, -47, -50, -53, -55, -58, -60, -61, -63, -66, -69, -69, -72, -76, -79, -80, -82, -82, -83, -84, -83, -82, -81, -80, -79, -77, -75, -72, -70, -66, -65, -61, -58, -54, -50, -45, -42, -35, -30, -26, -23, -19, -15, -13, -12, -12, -7, 2, 12, 19, 24, 25, 27, 30, 33, 34, 33, 35, 37, 37, 38, 38, 41, 43, 45, 46, 48, 46, 42, 42, 46, 47, 51, 59, 63, 66, 67, 68, 69, 70, 71, 72, 74, 75, 75, 74, 75, 84, 75, 68, 72, 73, 69, 71, 69, 69, 68, 70, 65, 63, 61, 57, 59, 58, 56, 54, 51, 50, 49, 47, 44, 42, 41, 39, 39, 37, 36, 34, 33, 31, 29, - /* -7.0 */ 27, 25, 24, 22, 21, 21, 20, 19, 20, 19, 18, 17, 17, 17, 17, 16, 15, 14, 14, 13, 12, 12, 11, 11, 11, 10, 10, 9, 9, 8, 7, 6, 5, 4, 4, 3, 3, 3, 2, 0, -0, -0, -1, -2, -4, -5, -6, -7, -8, -9, -10, -10, -11, -12, -12, -13, -13, -14, -14, -14, -15, -15, -15, -14, -14, -14, -14, -13, -13, -12, -12, -12, -12, -11, -12, -12, -12, -13, -13, -13, -13, -13, -13, -13, -14, -13, -13, -13, -12, -12, -11, -10, -8, -7, -5, -3, -2, -0, -2, 3, 9, 17, 19, 11, 12, 16, 20, 22, 23, 24, 23, 22, 19, 16, 13, 9, 7, 4, 1, -2, -4, -6, -9, -12, -16, -18, -20, -21, -21, -21, -22, -23, -24, -24, -25, -24, -23, -21, -18, -14, -11, -10, -9, -6, -4, -4, -9, -10, -9, -9, -8, -7, -7, -6, -5, -4, -2, -1, 1, 3, 5, 8, 9, 10, 12, 13, 14, 15, 16, 16, 16, 16, 16, 15, 15, 15, 16, 16, 16, 16, 15, 13, 11, 10, 9, 9, 8, 8, 7, 7, 8, 11, 13, 11, 10, 9, 7, 5, 3, 1, -2, -5, -7, -9, -10, -11, -13, -16, -15, -11, -11, -13, -14, -16, -16, -19, -20, -22, -25, -27, -30, -34, -36, -37, -38, -39, -40, -43, -43, -39, -39, -38, -38, -39, -39, -40, -42, -43, -44, -45, -49, -51, -53, -56, -58, -61, -63, -65, -66, -69, -73, -73, -74, -78, -82, -84, -85, -86, -86, -87, -86, -84, -82, -81, -81, -78, -76, -73, -70, -65, -64, -61, -58, -52, -48, -44, -40, -34, -29, -23, -18, -17, -15, -12, -9, -6, 8, 20, 22, 22, 24, 25, 28, 31, 34, 37, 39, 41, 43, 44, 44, 49, 48, 48, 49, 50, 50, 50, 50, 50, 45, 42, 46, 54, 63, 67, 68, 70, 70, 70, 72, 73, 75, 76, 77, 77, 78, 73, 60, 59, 65, 67, 70, 68, 60, 63, 70, 67, 62, 59, 56, 59, 58, 55, 53, 52, 50, 48, 46, 44, 42, 40, 39, 37, 37, 35, 32, 31, 30, 29, 27, - /* -6.0 */ 26, 24, 22, 21, 20, 19, 19, 18, 19, 18, 17, 17, 17, 17, 17, 16, 16, 15, 15, 14, 13, 12, 12, 12, 12, 11, 11, 10, 10, 10, 9, 7, 7, 6, 5, 5, 4, 3, 3, 1, 1, 0, -1, -2, -4, -5, -6, -7, -8, -9, -10, -10, -11, -12, -13, -14, -14, -14, -15, -15, -15, -15, -16, -16, -15, -15, -15, -15, -14, -13, -13, -13, -13, -13, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -12, -12, -11, -9, -8, -6, -5, -3, -1, -0, -3, 8, 10, 17, 19, 14, 13, 15, 18, 20, 22, 23, 23, 21, 18, 14, 12, 8, 3, 1, -2, -5, -6, -9, -11, -14, -17, -19, -21, -21, -22, -22, -23, -24, -24, -26, -25, -24, -23, -22, -19, -15, -12, -11, -8, -7, -5, -5, -8, -8, -8, -8, -7, -6, -6, -5, -3, -2, -1, 1, 2, 4, 6, 8, 10, 12, 13, 14, 15, 16, 17, 18, 17, 17, 16, 16, 16, 16, 16, 17, 17, 17, 16, 15, 12, 11, 9, 9, 8, 7, 7, 7, 8, 9, 11, 7, 6, 5, 4, 1, -1, -4, -6, -8, -10, -13, -15, -15, -15, -16, -15, -13, -13, -13, -15, -18, -18, -20, -20, -19, -23, -28, -32, -34, -37, -39, -39, -40, -41, -42, -42, -42, -41, -40, -40, -39, -41, -42, -43, -44, -45, -49, -51, -54, -56, -59, -61, -64, -66, -68, -69, -72, -76, -77, -76, -80, -86, -87, -88, -89, -89, -90, -90, -89, -87, -86, -84, -81, -77, -75, -71, -66, -63, -61, -56, -51, -48, -44, -37, -31, -27, -21, -17, -17, -12, -10, -4, 8, 14, 19, 21, 24, 26, 28, 31, 34, 37, 40, 42, 44, 46, 47, 50, 49, 51, 52, 55, 55, 54, 54, 53, 53, 50, 35, 44, 53, 58, 66, 68, 70, 70, 70, 73, 75, 79, 81, 82, 81, 72, 71, 70, 75, 81, 75, 60, 57, 56, 71, 65, 63, 60, 60, 60, 58, 56, 54, 52, 49, 47, 45, 44, 42, 40, 39, 37, 36, 34, 33, 32, 31, 28, 27, 26, - /* -5.0 */ 24, 23, 21, 20, 20, 19, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 16, 15, 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 10, 9, 8, 8, 7, 6, 5, 4, 3, 2, 1, -0, -1, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -12, -13, -14, -14, -15, -15, -16, -16, -17, -17, -17, -17, -16, -16, -16, -16, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -12, -11, -10, -9, -8, -6, -4, -2, -0, 1, -2, 11, 17, 18, 11, 10, 11, 15, 19, 21, 21, 22, 20, 19, 15, 13, 10, 6, 0, -3, -4, -6, -8, -11, -13, -16, -18, -20, -21, -22, -22, -22, -24, -25, -25, -26, -26, -25, -23, -22, -19, -15, -12, -10, -8, -7, -6, -7, -8, -8, -7, -6, -5, -5, -4, -3, -2, -1, 0, 2, 3, 5, 7, 9, 11, 12, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 14, 12, 10, 9, 8, 8, 7, 7, 6, 6, 4, 4, 3, 2, 0, -2, -6, -8, -10, -12, -14, -15, -16, -17, -16, -16, -15, -13, -15, -15, -16, -19, -20, -19, -19, -18, -23, -27, -30, -34, -38, -40, -41, -42, -42, -43, -43, -43, -43, -42, -42, -41, -43, -41, -41, -44, -49, -51, -54, -56, -59, -61, -64, -66, -69, -71, -72, -75, -78, -81, -81, -84, -88, -90, -91, -91, -92, -93, -93, -92, -88, -87, -86, -83, -79, -76, -72, -67, -64, -60, -56, -50, -46, -42, -35, -30, -24, -19, -19, -15, -9, -4, 8, 13, 16, 20, 23, 26, 28, 30, 33, 36, 40, 43, 45, 47, 47, 50, 54, 54, 57, 57, 56, 56, 58, 58, 58, 56, 55, 43, 49, 59, 57, 68, 68, 70, 69, 72, 76, 81, 84, 81, 77, 70, 68, 74, 78, 80, 82, 80, 74, 58, 60, 64, 66, 66, 63, 61, 59, 57, 54, 52, 50, 47, 45, 43, 42, 41, 39, 37, 35, 34, 33, 31, 29, 28, 27, 26, 24, - /* -4.0 */ 24, 22, 21, 20, 19, 19, 18, 18, 18, 18, 16, 17, 17, 16, 17, 17, 17, 16, 15, 14, 14, 14, 14, 14, 14, 14, 13, 12, 13, 12, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, -0, -2, -3, -4, -5, -6, -7, -9, -9, -10, -11, -12, -13, -14, -15, -15, -16, -16, -17, -18, -18, -18, -18, -18, -18, -18, -17, -17, -16, -16, -16, -15, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -12, -11, -11, -9, -8, -7, -5, -3, -1, 1, 2, 0, 8, 16, 17, 13, 10, 12, 16, 20, 21, 21, 20, 18, 16, 13, 10, 8, 4, -2, -5, -6, -7, -8, -10, -12, -16, -20, -20, -20, -21, -22, -23, -24, -25, -25, -26, -27, -26, -23, -21, -19, -15, -13, -10, -8, -9, -8, -8, -7, -6, -6, -6, -4, -3, -3, -2, -1, 0, 1, 3, 5, 6, 7, 10, 11, 13, 14, 16, 17, 18, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 15, 14, 12, 11, 9, 8, 8, 5, 5, 5, 3, 3, 3, 1, -2, -6, -9, -10, -13, -14, -15, -17, -18, -18, -18, -16, -15, -12, -12, -15, -17, -19, -20, -19, -19, -18, -21, -24, -31, -33, -37, -40, -41, -43, -44, -44, -44, -44, -44, -44, -44, -44, -44, -42, -44, -49, -51, -54, -56, -59, -61, -64, -67, -69, -71, -73, -75, -77, -81, -84, -86, -87, -90, -92, -93, -94, -94, -95, -94, -94, -91, -87, -87, -85, -80, -76, -73, -66, -63, -60, -55, -49, -44, -39, -33, -28, -22, -19, -19, -10, -3, 7, 11, 14, 17, 21, 24, 27, 29, 32, 35, 39, 42, 44, 48, 50, 48, 51, 57, 57, 61, 59, 56, 58, 59, 59, 59, 59, 58, 57, 54, 65, 67, 70, 76, 81, 82, 81, 77, 79, 78, 77, 75, 75, 77, 79, 81, 81, 80, 78, 74, 66, 63, 63, 65, 64, 61, 59, 56, 54, 52, 50, 48, 45, 44, 43, 41, 40, 38, 35, 34, 32, 30, 29, 29, 27, 26, 25, 24, - /* -3.0 */ 23, 21, 20, 20, 19, 19, 18, 18, 18, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 15, 15, 14, 14, 14, 14, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, -0, -1, -3, -4, -5, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -17, -18, -18, -19, -19, -19, -20, -19, -19, -19, -18, -18, -18, -17, -17, -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -13, -13, -12, -12, -11, -10, -8, -7, -6, -4, -3, -0, 2, 4, 3, 5, 10, 22, 16, 10, 14, 18, 20, 20, 19, 18, 17, 14, 10, 8, 6, 2, -2, -4, -7, -9, -12, -15, -15, -15, -18, -18, -19, -20, -22, -22, -24, -25, -26, -26, -27, -27, -24, -22, -20, -16, -13, -11, -11, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 4, 5, 6, 8, 10, 11, 13, 15, 16, 18, 19, 20, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 17, 15, 14, 13, 11, 10, 8, 8, 7, 4, 4, 5, 4, 2, -2, -8, -11, -13, -15, -15, -18, -20, -19, -19, -18, -16, -14, -9, -9, -13, -16, -18, -19, -18, -18, -16, -20, -25, -30, -31, -38, -40, -41, -43, -45, -45, -46, -46, -45, -45, -45, -46, -46, -47, -49, -51, -53, -55, -58, -61, -64, -66, -69, -71, -73, -75, -77, -80, -84, -87, -89, -90, -92, -95, -96, -97, -97, -98, -98, -96, -93, -88, -89, -87, -82, -77, -73, -67, -63, -59, -54, -48, -43, -37, -31, -27, -21, -23, -15, -10, 4, 8, 12, 15, 18, 22, 25, 28, 31, 34, 38, 41, 43, 45, 50, 53, 54, 56, 61, 61, 61, 58, 58, 60, 60, 59, 58, 60, 60, 59, 63, 69, 69, 69, 69, 77, 78, 76, 77, 78, 77, 78, 78, 79, 79, 80, 79, 78, 77, 76, 71, 67, 62, 63, 63, 61, 59, 56, 54, 52, 50, 48, 45, 44, 42, 40, 39, 38, 37, 34, 33, 32, 30, 27, 26, 26, 25, 24, 23, - /* -2.0 */ 22, 21, 20, 19, 19, 19, 17, 17, 17, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 13, 12, 12, 11, 10, 9, 8, 6, 5, 4, 3, 1, -0, -2, -3, -4, -6, -7, -8, -9, -10, -11, -13, -14, -15, -16, -17, -18, -19, -19, -20, -20, -21, -21, -21, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -14, -14, -13, -13, -13, -12, -11, -11, -10, -9, -8, -7, -5, -4, -2, 0, 3, 5, 6, 11, 18, 23, 23, 14, 16, 19, 20, 19, 17, 16, 15, 14, 10, 7, 5, 1, -2, -5, -7, -9, -12, -15, -16, -17, -19, -22, -22, -22, -23, -23, -24, -25, -25, -25, -26, -26, -22, -20, -19, -17, -16, -16, -13, -12, -11, -10, -8, -7, -6, -4, -4, -2, -1, 1, 2, 4, 5, 6, 8, 8, 10, 12, 13, 14, 15, 17, 18, 20, 20, 20, 20, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 16, 15, 14, 12, 11, 10, 7, 5, 7, 7, 4, 2, -3, -7, -11, -15, -18, -20, -21, -21, -21, -20, -19, -17, -14, -7, -8, -12, -16, -18, -18, -17, -19, -15, -20, -25, -29, -31, -38, -41, -41, -44, -45, -47, -47, -47, -47, -46, -47, -48, -48, -49, -51, -53, -55, -57, -60, -63, -66, -69, -71, -72, -75, -77, -79, -83, -86, -89, -91, -92, -93, -97, -98, -99,-100,-101,-100, -98, -94, -92, -90, -87, -83, -78, -72, -68, -64, -59, -54, -47, -42, -36, -30, -26, -25, -17, -16, -3, 5, 8, 12, 15, 19, 22, 26, 29, 33, 36, 39, 42, 45, 48, 51, 53, 51, 57, 64, 64, 61, 61, 61, 62, 64, 62, 59, 64, 68, 69, 71, 71, 70, 72, 72, 74, 75, 74, 71, 71, 73, 76, 78, 78, 78, 78, 76, 74, 73, 70, 66, 63, 62, 62, 61, 60, 57, 54, 51, 49, 48, 46, 44, 42, 41, 40, 38, 37, 35, 33, 32, 30, 27, 28, 27, 25, 24, 23, 22, - /* -1.0 */ 21, 20, 20, 19, 19, 17, 17, 17, 16, 16, 16, 15, 14, 16, 15, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 15, 14, 14, 13, 12, 12, 11, 10, 9, 8, 7, 5, 4, 2, 1, -0, -2, -3, -5, -6, -7, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -22, -23, -22, -22, -22, -21, -21, -20, -19, -19, -18, -18, -17, -17, -17, -16, -16, -15, -14, -14, -13, -13, -12, -11, -11, -10, -10, -6, -4, -4, -3, -2, -1, 1, 4, 7, 9, 10, 16, 24, 23, 15, 17, 19, 20, 19, 17, 15, 14, 12, 8, 5, 2, -1, -3, -6, -8, -9, -12, -15, -18, -20, -21, -24, -24, -23, -24, -23, -25, -25, -25, -25, -24, -22, -22, -23, -22, -20, -18, -16, -14, -12, -10, -8, -6, -4, -2, -1, 1, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 13, 15, 17, 18, 18, 19, 19, 20, 20, 20, 20, 20, 19, 19, 18, 18, 18, 18, 18, 18, 17, 18, 17, 17, 16, 16, 14, 14, 12, 9, 8, 8, 6, 4, 0, -4, -8, -13, -15, -19, -21, -21, -21, -21, -20, -18, -16, -12, -7, -8, -12, -14, -17, -17, -15, -15, -16, -20, -24, -28, -31, -34, -40, -42, -43, -45, -48, -49, -48, -49, -48, -48, -49, -50, -51, -53, -54, -56, -59, -62, -64, -67, -70, -72, -74, -77, -78, -81, -85, -88, -91, -94, -93, -95, -99, -99,-100,-101,-102,-101,-100, -97, -95, -92, -88, -84, -79, -74, -67, -62, -59, -54, -47, -41, -35, -29, -27, -23, -17, -12, -0, 3, 8, 11, 15, 19, 22, 26, 30, 34, 37, 41, 45, 48, 50, 54, 54, 54, 55, 62, 61, 64, 61, 50, 44, 45, 55, 68, 71, 72, 74, 77, 79, 78, 75, 75, 72, 70, 69, 72, 73, 73, 73, 73, 73, 73, 72, 71, 69, 64, 62, 60, 60, 59, 60, 59, 58, 56, 53, 50, 48, 46, 44, 42, 41, 39, 39, 37, 35, 33, 32, 31, 28, 28, 28, 26, 24, 24, 22, 21, - /* 0.0 */ 21, 20, 20, 19, 19, 18, 17, 16, 15, 15, 15, 15, 15, 15, 14, 15, 16, 16, 16, 16, 16, 17, 16, 16, 17, 16, 15, 14, 14, 13, 13, 12, 11, 10, 9, 8, 6, 5, 3, 2, 1, -1, -2, -4, -6, -7, -8, -9, -11, -12, -13, -14, -16, -17, -18, -19, -20, -21, -22, -23, -23, -24, -24, -24, -24, -23, -23, -22, -22, -21, -20, -20, -19, -19, -18, -18, -17, -16, -16, -15, -14, -13, -13, -12, -11, -11, -10, -9, -8, -6, -4, -4, -3, -2, -0, 1, 3, 6, 10, 9, 14, 22, 25, 17, 18, 20, 21, 19, 19, 17, 14, 11, 7, 3, 0, -2, -5, -7, -8, -10, -13, -16, -19, -21, -23, -25, -26, -25, -24, -24, -26, -27, -26, -26, -25, -23, -25, -25, -23, -20, -19, -16, -14, -12, -10, -8, -7, -4, -2, 0, 2, 4, 6, 8, 9, 10, 10, 10, 11, 12, 13, 13, 15, 17, 18, 19, 19, 19, 19, 19, 19, 20, 19, 19, 19, 19, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 17, 16, 14, 12, 9, 9, 8, 6, 3, -1, -4, -8, -11, -15, -17, -19, -20, -21, -21, -19, -17, -15, -12, -7, -10, -12, -12, -14, -16, -16, -14, -12, -19, -23, -27, -30, -33, -35, -41, -43, -45, -48, -49, -50, -49, -49, -49, -50, -51, -52, -53, -55, -58, -60, -63, -66, -68, -71, -73, -75, -78, -80, -83, -86, -89, -92, -95, -95, -96,-100,-101,-102,-103,-103,-103,-102, -99, -94, -93, -89, -84, -79, -74, -69, -63, -58, -53, -47, -40, -34, -30, -29, -19, -13, -7, -2, 2, 6, 10, 14, 18, 22, 26, 30, 34, 37, 41, 45, 50, 54, 55, 55, 53, 54, 58, 61, 63, 56, 55, 51, 47, 69, 72, 74, 77, 76, 73, 74, 73, 72, 68, 68, 70, 71, 72, 72, 72, 72, 71, 69, 68, 66, 66, 62, 63, 61, 59, 58, 59, 59, 59, 56, 54, 52, 49, 47, 45, 44, 42, 41, 39, 38, 36, 34, 32, 31, 29, 28, 28, 25, 25, 23, 23, 22, 21, - /* 1.0 */ 19, 20, 19, 19, 18, 17, 17, 16, 15, 15, 15, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 16, 16, 15, 15, 14, 13, 12, 11, 11, 10, 8, 7, 6, 5, 3, 1, -0, -2, -4, -5, -7, -8, -9, -11, -12, -13, -15, -16, -17, -18, -19, -21, -22, -23, -24, -24, -25, -25, -25, -25, -25, -25, -24, -24, -23, -22, -21, -21, -20, -19, -19, -18, -17, -17, -16, -15, -14, -13, -13, -12, -11, -10, -9, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 6, 8, 10, 12, 18, 28, 24, 19, 20, 22, 21, 20, 17, 14, 10, 6, 2, 1, -1, -6, -8, -9, -11, -14, -17, -20, -23, -25, -26, -28, -28, -27, -26, -27, -28, -27, -26, -26, -28, -27, -25, -22, -20, -18, -15, -13, -11, -8, -6, -4, -1, 1, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 13, 12, 12, 15, 16, 17, 17, 17, 18, 19, 19, 20, 20, 19, 19, 18, 18, 18, 18, 17, 17, 17, 16, 16, 16, 16, 15, 16, 14, 13, 11, 11, 9, 7, 4, -0, -3, -6, -10, -13, -15, -18, -19, -19, -19, -18, -16, -14, -13, -11, -12, -13, -14, -14, -16, -12, -16, -14, -19, -24, -26, -29, -31, -33, -36, -42, -44, -47, -50, -51, -49, -50, -50, -51, -52, -53, -54, -56, -58, -61, -64, -66, -68, -71, -73, -76, -78, -81, -84, -88, -91, -94, -96, -96, -97,-100,-102,-103,-103,-103,-103,-102,-100, -96, -95, -91, -86, -80, -74, -68, -61, -58, -52, -47, -40, -35, -32, -26, -19, -12, -7, -3, 1, 4, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 50, 55, 58, 58, 58, 56, 56, 64, 65, 63, 67, 68, 58, 65, 71, 72, 73, 74, 74, 74, 73, 71, 71, 71, 71, 71, 71, 71, 71, 70, 69, 68, 67, 66, 66, 62, 62, 59, 58, 57, 57, 57, 57, 55, 53, 50, 48, 46, 45, 43, 42, 40, 39, 37, 35, 33, 31, 31, 28, 29, 26, 26, 24, 23, 21, 20, 19, - /* 2.0 */ 19, 19, 19, 18, 18, 17, 16, 15, 15, 14, 14, 14, 14, 14, 14, 15, 15, 16, 15, 16, 17, 17, 18, 18, 16, 15, 14, 14, 14, 13, 12, 11, 10, 9, 7, 6, 5, 4, 2, 0, -1, -3, -4, -6, -8, -9, -11, -12, -13, -14, -16, -17, -18, -20, -21, -22, -23, -24, -25, -26, -26, -27, -27, -27, -26, -26, -25, -25, -24, -23, -23, -22, -21, -20, -19, -18, -18, -17, -16, -15, -14, -13, -12, -10, -10, -9, -7, -6, -5, -4, -3, -2, -1, 0, 1, 3, 5, 7, 9, 11, 11, 13, 20, 26, 24, 20, 20, 20, 18, 14, 11, 8, 4, -0, -1, -4, -6, -9, -10, -12, -16, -19, -22, -24, -26, -28, -29, -29, -29, -28, -29, -29, -28, -30, -32, -29, -27, -24, -22, -20, -17, -15, -13, -10, -8, -5, -2, 0, 3, 5, 7, 7, 8, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 16, 18, 20, 20, 20, 19, 18, 18, 18, 19, 19, 18, 17, 17, 17, 17, 16, 16, 16, 15, 15, 16, 14, 13, 13, 12, 9, 7, 4, 0, -1, -3, -7, -10, -14, -16, -18, -16, -16, -15, -14, -13, -13, -11, -11, -13, -14, -14, -16, -15, -17, -16, -20, -23, -25, -28, -30, -30, -33, -36, -40, -46, -50, -51, -50, -50, -51, -52, -53, -54, -55, -56, -58, -61, -63, -66, -68, -71, -74, -76, -79, -81, -85, -89, -92, -95, -97, -97, -99,-100,-102,-104,-104,-104,-104,-103,-102, -99, -95, -90, -85, -80, -73, -66, -61, -56, -51, -47, -43, -39, -32, -27, -21, -10, -7, -4, -0, 4, 8, 12, 15, 20, 23, 26, 30, 34, 38, 41, 45, 53, 56, 58, 57, 54, 54, 59, 59, 60, 64, 70, 62, 56, 68, 69, 72, 74, 74, 74, 73, 72, 71, 70, 70, 70, 69, 70, 69, 68, 67, 66, 66, 65, 64, 62, 60, 57, 56, 56, 56, 56, 55, 54, 52, 50, 47, 46, 44, 42, 40, 39, 38, 36, 34, 32, 31, 30, 27, 28, 26, 25, 23, 21, 21, 20, 19, - /* 3.0 */ 19, 18, 18, 17, 17, 16, 16, 15, 14, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 17, 17, 16, 15, 14, 14, 12, 11, 10, 10, 9, 8, 7, 5, 4, 3, 1, -0, -2, -3, -5, -7, -9, -10, -11, -13, -14, -16, -17, -18, -20, -21, -22, -23, -25, -25, -26, -27, -28, -28, -28, -28, -28, -27, -26, -26, -25, -24, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -12, -11, -10, -9, -8, -7, -5, -4, -3, -2, -1, 0, 1, 2, 4, 5, 7, 10, 12, 13, 11, 15, 24, 27, 18, 18, 16, 12, 9, 6, 3, 1, -3, -6, -7, -6, -10, -13, -14, -17, -20, -23, -26, -28, -29, -30, -30, -30, -31, -31, -29, -29, -31, -31, -29, -27, -25, -23, -21, -18, -15, -12, -10, -7, -4, -2, 1, 4, 5, 6, 8, 8, 9, 10, 11, 11, 12, 13, 13, 15, 15, 15, 16, 17, 18, 18, 19, 20, 21, 20, 21, 20, 20, 20, 19, 18, 18, 18, 17, 17, 17, 16, 15, 14, 16, 17, 17, 16, 15, 15, 13, 11, 8, 6, 3, 1, -0, -3, -7, -10, -13, -14, -13, -12, -12, -11, -12, -12, -11, -11, -13, -14, -13, -13, -15, -17, -18, -20, -21, -24, -27, -29, -30, -31, -35, -37, -41, -47, -50, -50, -52, -51, -53, -53, -54, -56, -57, -59, -61, -63, -66, -68, -71, -73, -76, -79, -82, -86, -90, -93, -95, -98, -96, -99,-101,-103,-104,-103,-104,-104,-104,-102, -99, -95, -91, -85, -80, -74, -67, -60, -55, -51, -49, -44, -37, -31, -29, -19, -12, -9, -5, -1, 2, 5, 9, 13, 18, 21, 24, 28, 31, 35, 40, 45, 50, 54, 57, 55, 55, 57, 59, 62, 65, 68, 70, 67, 56, 62, 67, 73, 73, 74, 73, 72, 71, 70, 69, 69, 69, 68, 68, 68, 67, 66, 65, 64, 64, 63, 61, 57, 56, 54, 54, 55, 55, 54, 53, 50, 49, 47, 46, 43, 41, 40, 38, 36, 34, 32, 30, 30, 29, 26, 28, 25, 24, 22, 21, 20, 19, 19, - /* 4.0 */ 17, 17, 16, 16, 17, 16, 15, 14, 14, 14, 13, 13, 14, 13, 14, 14, 15, 16, 17, 16, 17, 17, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 7, 6, 5, 4, 3, 2, 0, -1, -3, -4, -6, -8, -10, -12, -13, -15, -16, -17, -19, -20, -21, -22, -23, -25, -26, -27, -28, -28, -29, -29, -29, -29, -29, -29, -28, -27, -27, -26, -25, -24, -23, -21, -20, -19, -18, -17, -16, -14, -13, -12, -11, -10, -9, -8, -7, -5, -4, -3, -2, -0, 1, 3, 4, 5, 7, 9, 10, 13, 14, 13, 10, 17, 27, 18, 19, 10, 6, 4, 2, -1, -3, -6, -7, -8, -9, -12, -14, -15, -18, -22, -24, -27, -31, -33, -33, -32, -33, -34, -32, -29, -30, -31, -32, -30, -28, -26, -23, -21, -18, -15, -13, -10, -7, -4, -1, 2, 4, 5, 6, 8, 9, 10, 10, 12, 12, 13, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 24, 25, 24, 23, 22, 21, 20, 20, 19, 18, 17, 16, 15, 17, 19, 21, 19, 18, 20, 16, 15, 14, 12, 10, 8, 5, 3, -3, -6, -8, -9, -10, -11, -11, -11, -11, -11, -11, -11, -12, -13, -13, -12, -11, -14, -16, -17, -16, -18, -22, -26, -30, -30, -31, -34, -37, -39, -43, -47, -49, -53, -54, -52, -53, -54, -55, -57, -59, -61, -63, -65, -67, -70, -73, -77, -80, -83, -87, -90, -93, -96, -98, -96,-100,-101,-103,-104,-104,-106,-106,-105,-103, -99, -95, -90, -86, -80, -73, -67, -60, -55, -51, -51, -44, -43, -33, -22, -20, -15, -11, -7, -2, 1, 3, 6, 10, 15, 19, 22, 25, 29, 33, 37, 42, 47, 52, 56, 55, 57, 59, 61, 63, 66, 68, 69, 70, 62, 65, 66, 71, 72, 72, 72, 71, 70, 69, 68, 67, 67, 67, 67, 67, 66, 65, 64, 63, 62, 62, 59, 57, 55, 53, 53, 54, 54, 52, 53, 49, 48, 47, 45, 41, 41, 38, 36, 34, 33, 31, 30, 28, 28, 25, 26, 24, 23, 21, 19, 19, 18, 17, - /* 5.0 */ 16, 16, 16, 16, 16, 15, 13, 13, 13, 13, 12, 12, 13, 13, 14, 14, 15, 16, 16, 17, 16, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 6, 5, 4, 3, 1, -0, -1, -3, -4, -6, -8, -10, -12, -13, -15, -16, -17, -19, -20, -21, -23, -24, -25, -26, -27, -28, -29, -30, -30, -30, -31, -31, -31, -30, -29, -29, -28, -27, -26, -24, -23, -22, -21, -19, -18, -17, -15, -14, -13, -11, -10, -9, -8, -7, -6, -5, -4, -3, -1, 0, 2, 4, 6, 6, 8, 9, 10, 12, 13, 14, 12, 16, 27, 23, 22, 13, 3, -0, -2, -5, -6, -5, -8, -9, -10, -15, -13, -14, -19, -24, -25, -27, -33, -34, -33, -34, -34, -34, -36, -35, -35, -34, -33, -31, -29, -26, -24, -21, -18, -16, -13, -10, -7, -4, -1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 17, 17, 17, 18, 19, 20, 20, 21, 23, 23, 27, 30, 30, 29, 27, 26, 24, 25, 24, 22, 20, 20, 17, 16, 18, 21, 19, 19, 20, 21, 20, 18, 16, 14, 12, 9, 6, 4, -1, -5, -8, -8, -7, -9, -9, -10, -11, -12, -11, -11, -11, -12, -13, -13, -13, -13, -15, -14, -15, -17, -21, -24, -29, -30, -31, -34, -36, -39, -41, -46, -49, -53, -54, -54, -53, -54, -55, -56, -57, -60, -62, -64, -66, -70, -74, -78, -81, -84, -88, -91, -94, -96, -97, -96,-100,-101,-102,-103,-105,-107,-106,-105,-103, -99, -95, -90, -86, -80, -73, -67, -60, -54, -52, -50, -49, -42, -29, -26, -21, -17, -13, -8, -3, -1, 0, 3, 8, 12, 17, 20, 23, 27, 31, 34, 39, 44, 49, 54, 57, 59, 62, 62, 64, 66, 67, 64, 65, 53, 56, 68, 70, 69, 70, 71, 69, 68, 68, 67, 67, 66, 66, 65, 66, 65, 64, 63, 62, 61, 61, 59, 55, 54, 53, 52, 54, 52, 51, 51, 49, 47, 45, 43, 40, 40, 36, 34, 33, 30, 30, 29, 28, 27, 25, 24, 23, 22, 21, 18, 18, 17, 16, - /* 6.0 */ 16, 16, 16, 16, 15, 13, 12, 11, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 16, 16, 15, 14, 13, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 1, 0, -1, -3, -5, -6, -8, -10, -11, -13, -15, -16, -18, -19, -20, -22, -23, -24, -25, -27, -28, -29, -30, -31, -31, -32, -32, -32, -32, -32, -31, -31, -30, -29, -28, -26, -25, -24, -23, -21, -20, -18, -17, -15, -14, -12, -11, -10, -9, -8, -6, -5, -4, -3, -2, -1, 1, 3, 4, 6, 8, 9, 10, 13, 13, 14, 14, 12, 19, 26, 20, 13, 20, 6, -3, -5, -7, -10, -8, -6, -7, -13, -17, -16, -19, -23, -26, -27, -28, -32, -32, -32, -33, -33, -36, -38, -38, -38, -36, -34, -32, -30, -27, -24, -22, -19, -16, -13, -10, -7, -4, -1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 18, 18, 19, 20, 21, 22, 23, 25, 28, 30, 31, 31, 29, 29, 27, 27, 28, 27, 27, 26, 25, 21, 19, 19, 20, 19, 20, 21, 22, 23, 20, 18, 15, 12, 10, 8, 5, 1, -3, -6, -6, -6, -7, -8, -9, -11, -11, -10, -10, -11, -12, -13, -13, -13, -13, -13, -13, -13, -14, -18, -23, -26, -29, -30, -32, -34, -37, -40, -42, -49, -52, -53, -55, -54, -54, -54, -55, -57, -58, -60, -62, -66, -70, -74, -78, -82, -85, -88, -91, -94, -96, -97, -97,-100,-101,-102,-102,-104,-105,-100, -98,-100, -98, -95, -90, -85, -79, -73, -67, -60, -55, -55, -54, -52, -40, -34, -30, -23, -19, -15, -10, -7, -5, -3, 0, 6, 10, 14, 17, 21, 24, 28, 31, 35, 42, 47, 53, 53, 56, 60, 67, 65, 66, 67, 70, 64, 45, 60, 68, 68, 67, 67, 69, 66, 66, 67, 66, 66, 65, 64, 64, 64, 64, 63, 63, 61, 60, 59, 58, 57, 53, 53, 52, 52, 50, 49, 50, 48, 45, 43, 41, 38, 36, 35, 32, 31, 29, 29, 28, 28, 25, 27, 24, 23, 21, 21, 18, 18, 16, 16, - /* 7.0 */ 16, 15, 15, 15, 14, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, -0, -1, -3, -5, -6, -8, -10, -11, -13, -15, -16, -18, -20, -21, -23, -24, -25, -27, -28, -29, -30, -31, -32, -32, -33, -33, -34, -33, -34, -33, -33, -32, -31, -30, -29, -27, -26, -25, -23, -22, -20, -18, -16, -15, -13, -12, -10, -9, -8, -7, -6, -5, -3, -2, -1, 0, 1, 3, 5, 6, 8, 11, 11, 12, 12, 12, 12, 14, 17, 22, 14, 4, 11, 3, -5, -7, -8, -10, -12, -10, -12, -16, -21, -24, -26, -27, -29, -30, -31, -32, -33, -33, -34, -39, -40, -40, -40, -39, -38, -35, -32, -30, -28, -25, -22, -19, -16, -13, -10, -7, -4, -1, 1, 3, 4, 6, 7, 9, 10, 12, 13, 14, 15, 17, 17, 18, 19, 19, 20, 21, 22, 23, 27, 31, 31, 31, 32, 31, 30, 30, 28, 28, 28, 28, 27, 26, 27, 26, 25, 24, 23, 22, 22, 22, 21, 20, 20, 19, 17, 15, 12, 8, 6, 3, -0, -2, -3, -3, -5, -6, -9, -9, -8, -8, -10, -11, -11, -12, -13, -12, -12, -11, -11, -11, -11, -14, -19, -23, -25, -26, -28, -31, -33, -36, -39, -44, -51, -53, -54, -56, -54, -53, -54, -56, -57, -59, -62, -66, -70, -74, -78, -82, -85, -89, -91, -94, -96, -97, -97,-100,-100,-101,-101,-103,-103, -97, -93, -95, -96, -94, -90, -85, -79, -74, -67, -60, -56, -58, -59, -50, -42, -35, -31, -25, -21, -17, -14, -12, -9, -5, -2, 3, 7, 11, 15, 18, 22, 26, 31, 33, 36, 44, 48, 52, 53, 55, 59, 67, 66, 69, 71, 62, 51, 62, 67, 67, 66, 66, 67, 68, 63, 63, 61, 64, 64, 63, 63, 63, 63, 62, 61, 60, 59, 58, 58, 53, 52, 55, 52, 50, 50, 48, 46, 49, 43, 41, 39, 37, 35, 33, 32, 30, 28, 26, 27, 26, 26, 26, 23, 22, 21, 19, 18, 17, 16, 16, - /* 8.0 */ 15, 14, 13, 13, 12, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 15, 14, 14, 13, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 2, 1, -0, -1, -3, -4, -6, -8, -9, -11, -13, -14, -16, -18, -19, -22, -23, -25, -26, -27, -29, -30, -31, -32, -33, -34, -35, -35, -35, -35, -35, -35, -35, -34, -33, -32, -31, -29, -28, -27, -25, -23, -22, -20, -18, -16, -15, -13, -12, -10, -9, -8, -6, -5, -4, -3, -2, -0, 1, 2, 4, 5, 7, 9, 11, 12, 14, 15, 15, 15, 15, 12, 9, 4, 2, 4, 0, -5, -9, -10, -11, -13, -14, -18, -21, -25, -27, -29, -30, -31, -33, -35, -37, -38, -37, -39, -43, -43, -42, -42, -40, -37, -35, -32, -30, -28, -25, -21, -18, -15, -12, -10, -7, -5, -3, -2, -0, 2, 4, 6, 7, 9, 10, 12, 13, 15, 17, 19, 19, 19, 20, 21, 23, 24, 31, 33, 30, 32, 34, 35, 34, 31, 30, 29, 27, 28, 27, 26, 26, 26, 26, 26, 25, 25, 24, 24, 22, 21, 20, 19, 18, 16, 14, 12, 9, 6, 4, 2, -1, -1, -2, -3, -5, -5, -6, -7, -7, -9, -10, -10, -11, -12, -12, -10, -8, -8, -9, -11, -12, -16, -19, -21, -22, -25, -28, -29, -31, -34, -39, -47, -52, -53, -54, -55, -52, -53, -54, -55, -58, -62, -66, -70, -74, -78, -81, -85, -88, -91, -93, -95, -96, -97, -99,-100,-100, -97, -99,-100, -96, -94, -95, -95, -92, -88, -84, -78, -73, -67, -62, -58, -58, -60, -49, -43, -36, -32, -27, -23, -19, -17, -14, -11, -7, -3, -0, 4, 8, 13, 16, 20, 25, 29, 33, 36, 38, 46, 50, 52, 54, 56, 60, 67, 71, 71, 65, 55, 61, 65, 64, 64, 64, 64, 64, 63, 63, 65, 58, 63, 63, 62, 61, 62, 59, 60, 60, 59, 59, 58, 52, 50, 52, 49, 48, 49, 46, 44, 42, 41, 39, 37, 35, 33, 31, 30, 29, 28, 28, 27, 25, 26, 23, 22, 22, 20, 19, 18, 16, 16, 15, - /* 9.0 */ 14, 13, 13, 12, 11, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 13, 12, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, -0, -1, -3, -4, -6, -7, -9, -11, -12, -14, -15, -17, -19, -21, -23, -25, -26, -28, -29, -31, -32, -33, -34, -35, -36, -37, -37, -37, -37, -37, -37, -36, -35, -34, -33, -32, -30, -29, -27, -25, -23, -22, -20, -18, -16, -15, -13, -12, -10, -9, -8, -6, -5, -3, -2, -1, 0, 1, 3, 4, 6, 6, 7, 10, 15, 13, 11, 12, 14, 10, 1, 2, -2, -2, -2, -11, -5, -8, -12, -13, -15, -18, -23, -29, -33, -35, -34, -33, -36, -40, -40, -42, -44, -42, -44, -44, -43, -42, -41, -39, -37, -35, -33, -30, -26, -23, -20, -16, -14, -12, -10, -8, -6, -4, -3, -1, 1, 3, 5, 7, 8, 10, 12, 13, 15, 16, 19, 20, 19, 21, 23, 25, 29, 32, 32, 30, 33, 34, 35, 34, 31, 29, 28, 27, 27, 26, 25, 24, 24, 25, 25, 24, 24, 25, 25, 23, 23, 21, 19, 19, 16, 14, 12, 9, 6, 4, 1, -1, -1, -1, -1, -2, -3, -4, -5, -6, -7, -8, -8, -9, -10, -8, -4, -7, -7, -7, -8, -12, -12, -14, -17, -18, -22, -25, -27, -28, -30, -34, -42, -49, -51, -52, -53, -51, -51, -53, -55, -58, -62, -66, -70, -74, -77, -80, -84, -87, -90, -92, -94, -95, -96, -98, -99, -96, -96, -97, -97, -96, -95, -98, -95, -92, -88, -84, -78, -73, -67, -62, -61, -59, -61, -51, -44, -39, -34, -29, -25, -22, -20, -17, -13, -9, -6, -3, 2, 6, 10, 13, 18, 23, 26, 31, 35, 38, 42, 49, 49, 54, 55, 53, 60, 64, 68, 68, 51, 60, 62, 62, 61, 61, 62, 61, 62, 62, 62, 59, 61, 60, 61, 60, 57, 55, 56, 56, 54, 54, 51, 56, 47, 51, 46, 43, 43, 43, 42, 40, 38, 35, 35, 34, 32, 30, 29, 30, 29, 28, 25, 28, 26, 22, 22, 20, 19, 18, 18, 16, 15, 14, - /* 10.0 */ 13, 12, 12, 11, 10, 10, 10, 10, 11, 12, 12, 12, 12, 13, 13, 15, 13, 13, 12, 11, 10, 10, 9, 8, 7, 6, 5, 5, 3, 2, 1, 0, -1, -2, -3, -4, -5, -7, -8, -10, -11, -13, -15, -17, -19, -21, -23, -24, -26, -28, -29, -31, -32, -34, -35, -36, -37, -38, -38, -39, -39, -39, -39, -39, -38, -37, -36, -34, -33, -31, -29, -27, -26, -24, -22, -20, -18, -16, -15, -13, -12, -10, -9, -7, -6, -5, -3, -2, -1, 0, 1, 3, 4, 4, 6, 10, 14, 9, 6, 3, 1, 1, -2, -4, -3, -5, -4, -1, -13, -14, -11, -13, -16, -17, -23, -28, -32, -40, -45, -43, -42, -41, -42, -44, -46, -45, -45, -45, -45, -44, -43, -41, -39, -37, -35, -32, -29, -26, -22, -19, -16, -15, -13, -11, -9, -7, -5, -3, -1, 1, 3, 5, 6, 8, 10, 11, 13, 14, 16, 16, 17, 19, 21, 25, 29, 30, 31, 33, 32, 33, 33, 32, 32, 30, 28, 28, 27, 26, 25, 24, 23, 22, 24, 24, 23, 23, 24, 25, 24, 24, 22, 19, 18, 17, 15, 13, 10, 8, 6, 4, 2, 0, -0, -0, -0, -1, -2, -3, -5, -6, -5, -6, -7, -8, -4, -4, -5, -6, -7, -8, -10, -12, -13, -15, -18, -20, -23, -25, -26, -28, -32, -37, -44, -48, -50, -51, -50, -50, -51, -54, -58, -62, -66, -70, -72, -76, -79, -83, -85, -88, -91, -93, -94, -95, -97, -97, -95, -95, -95, -95, -96, -98, -97, -95, -91, -88, -84, -79, -74, -68, -63, -63, -61, -64, -53, -46, -42, -36, -32, -28, -25, -23, -19, -16, -12, -9, -5, -1, 3, 8, 11, 15, 19, 24, 29, 32, 37, 40, 45, 50, 52, 56, 54, 62, 65, 65, 64, 50, 59, 60, 59, 59, 58, 58, 59, 60, 60, 60, 60, 55, 61, 56, 54, 52, 53, 55, 53, 51, 51, 46, 45, 44, 44, 42, 41, 41, 40, 39, 38, 36, 35, 36, 33, 32, 30, 28, 28, 26, 25, 26, 25, 23, 22, 21, 20, 19, 18, 16, 15, 14, 13, - /* 11.0 */ 12, 11, 11, 11, 11, 11, 11, 10, 11, 10, 12, 12, 12, 13, 13, 13, 13, 12, 11, 10, 9, 8, 8, 6, 6, 5, 4, 3, 2, 0, -1, -1, -2, -3, -4, -5, -6, -8, -9, -11, -12, -15, -16, -18, -20, -22, -24, -26, -28, -29, -31, -32, -34, -35, -37, -38, -39, -40, -40, -41, -41, -41, -41, -40, -39, -38, -37, -35, -34, -32, -30, -28, -26, -24, -22, -20, -18, -16, -14, -13, -11, -10, -9, -7, -6, -5, -3, -2, -0, 1, 2, 3, 1, -1, 6, 8, 9, 6, 3, 1, -1, -2, -4, -6, -9, -9, 0, -5, -13, -17, -17, -17, -22, -23, -26, -30, -30, -33, -39, -42, -46, -45, -45, -47, -47, -46, -45, -45, -45, -44, -43, -41, -39, -37, -35, -31, -27, -25, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -2, 0, 2, 4, 7, 9, 10, 12, 14, 15, 16, 16, 17, 19, 20, 26, 28, 29, 31, 32, 35, 34, 32, 32, 31, 29, 29, 29, 28, 26, 25, 24, 23, 23, 22, 23, 22, 21, 22, 22, 22, 22, 21, 19, 18, 16, 15, 13, 11, 10, 8, 6, 4, 3, 3, 2, 2, 0, -1, -2, -3, -3, -2, -3, -5, -5, -4, -5, -5, -3, -6, -7, -9, -11, -12, -13, -17, -20, -21, -24, -25, -28, -28, -33, -40, -44, -47, -48, -48, -49, -52, -54, -58, -62, -65, -68, -71, -75, -78, -81, -84, -87, -90, -91, -92, -93, -95, -94, -92, -94, -94, -93, -93, -99, -96, -93, -90, -88, -84, -79, -74, -68, -64, -63, -61, -63, -53, -48, -44, -38, -34, -30, -28, -25, -22, -18, -15, -12, -8, -3, 1, 6, 9, 12, 16, 20, 25, 30, 35, 39, 42, 48, 52, 54, 55, 60, 62, 65, 55, 52, 57, 58, 57, 56, 56, 56, 56, 58, 58, 58, 59, 50, 51, 43, 38, 41, 46, 51, 50, 50, 47, 46, 44, 43, 42, 41, 40, 39, 37, 39, 36, 34, 34, 33, 32, 29, 29, 27, 27, 28, 26, 23, 25, 22, 21, 20, 19, 17, 16, 15, 14, 13, 12, - /* 12.0 */ 11, 10, 11, 11, 11, 11, 10, 11, 11, 10, 11, 12, 12, 12, 12, 12, 11, 10, 10, 9, 8, 8, 6, 5, 5, 4, 3, 2, 0, -1, -2, -2, -3, -4, -5, -6, -8, -9, -10, -12, -13, -15, -18, -19, -21, -23, -25, -27, -29, -31, -32, -34, -35, -37, -38, -39, -40, -41, -42, -42, -42, -42, -42, -41, -40, -39, -38, -36, -35, -33, -31, -29, -27, -25, -22, -20, -18, -16, -14, -12, -10, -9, -8, -7, -6, -5, -3, -2, -1, -0, -2, -3, -2, -0, 6, 9, 7, 6, 3, 3, 0, -2, -4, -6, -10, -16, -20, -18, -16, -22, -23, -25, -26, -30, -34, -36, -32, -38, -38, -43, -49, -49, -45, -48, -47, -46, -45, -45, -44, -43, -42, -41, -38, -35, -32, -29, -26, -24, -22, -20, -19, -17, -15, -13, -11, -9, -6, -4, -2, 1, 3, 6, 8, 10, 12, 14, 15, 15, 16, 18, 19, 20, 21, 27, 28, 29, 30, 30, 33, 33, 33, 32, 31, 29, 29, 29, 28, 27, 26, 25, 24, 24, 22, 22, 20, 20, 21, 21, 22, 21, 21, 19, 17, 16, 14, 13, 12, 11, 8, 7, 5, 5, 5, 5, 4, 3, 1, -0, -0, -0, -1, -1, -3, -4, -5, -5, -4, -2, -2, -3, -8, -9, -10, -12, -15, -17, -19, -21, -23, -26, -28, -30, -34, -37, -41, -43, -45, -46, -51, -54, -57, -60, -63, -67, -70, -73, -76, -79, -82, -85, -88, -89, -90, -92, -93, -91, -90, -89, -91, -91, -93, -96, -95, -92, -89, -87, -83, -79, -74, -69, -64, -63, -62, -62, -54, -49, -46, -39, -36, -32, -29, -27, -24, -20, -17, -14, -10, -5, 1, 4, 6, 9, 13, 18, 22, 27, 31, 36, 38, 43, 49, 51, 52, 55, 58, 60, 47, 52, 55, 55, 55, 54, 54, 54, 54, 55, 56, 56, 56, 54, 53, 48, 46, 48, 38, 35, 42, 47, 47, 46, 45, 43, 41, 40, 39, 38, 36, 34, 33, 33, 32, 30, 31, 28, 27, 30, 26, 26, 23, 23, 22, 20, 19, 18, 17, 16, 14, 14, 13, 12, 11, - /* 13.0 */ 10, 10, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 11, 11, 10, 8, 8, 7, 6, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -4, -5, -6, -7, -9, -10, -11, -13, -14, -16, -18, -20, -22, -24, -26, -28, -30, -32, -34, -35, -37, -38, -39, -41, -42, -43, -43, -43, -43, -43, -43, -42, -41, -40, -39, -37, -35, -33, -31, -30, -28, -25, -23, -20, -18, -16, -14, -12, -11, -9, -8, -7, -6, -5, -4, -4, -6, -5, -3, -1, -0, 4, 7, 7, 6, 5, 2, 0, -2, -4, -6, -8, -11, -17, -22, -24, -26, -26, -30, -35, -38, -40, -40, -37, -35, -38, -42, -39, -48, -48, -46, -47, -46, -46, -45, -44, -44, -43, -41, -40, -37, -34, -31, -27, -25, -24, -22, -20, -18, -17, -15, -13, -11, -9, -6, -3, -1, 2, 4, 7, 9, 11, 13, 14, 16, 16, 17, 19, 20, 21, 23, 29, 30, 31, 31, 31, 31, 31, 32, 33, 31, 29, 28, 28, 28, 27, 26, 26, 25, 24, 23, 22, 21, 20, 19, 20, 21, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 7, 7, 8, 6, 4, 2, 2, 2, 1, -1, -2, -2, -4, -4, -3, -3, -1, -2, -5, -8, -9, -11, -11, -15, -18, -19, -21, -23, -26, -28, -31, -34, -37, -40, -42, -44, -47, -52, -57, -59, -62, -65, -68, -71, -74, -77, -80, -83, -86, -87, -88, -89, -89, -91, -88, -86, -87, -89, -92, -93, -92, -90, -87, -86, -82, -78, -73, -69, -65, -62, -62, -61, -57, -50, -47, -41, -38, -34, -32, -29, -25, -22, -20, -16, -12, -7, -2, 1, 3, 6, 11, 15, 19, 24, 28, 32, 36, 38, 38, 47, 50, 51, 53, 46, 45, 51, 53, 53, 52, 52, 52, 52, 52, 54, 54, 55, 55, 54, 53, 52, 53, 54, 53, 46, 32, 40, 47, 46, 44, 42, 41, 39, 38, 36, 34, 35, 32, 31, 30, 30, 29, 28, 26, 26, 24, 22, 21, 20, 20, 18, 17, 16, 15, 14, 14, 13, 12, 12, 10, - /* 14.0 */ 9, 10, 10, 10, 9, 9, 9, 9, 9, 9, 10, 11, 11, 11, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, -0, -2, -3, -3, -4, -4, -5, -6, -7, -8, -10, -11, -12, -14, -15, -17, -19, -21, -23, -25, -27, -29, -32, -33, -35, -36, -38, -39, -40, -42, -43, -44, -44, -44, -44, -44, -44, -43, -42, -41, -39, -37, -36, -34, -32, -30, -28, -25, -23, -21, -18, -16, -14, -13, -11, -9, -8, -7, -6, -6, -9, -7, -4, -3, 0, 3, 4, 5, 6, 6, 3, 2, 1, -1, -3, -6, -8, -12, -15, -18, -21, -23, -25, -29, -33, -35, -36, -37, -37, -37, -37, -38, -41, -39, -47, -53, -49, -48, -48, -47, -46, -44, -43, -42, -41, -38, -35, -32, -29, -26, -25, -23, -21, -20, -18, -16, -14, -11, -9, -7, -5, -2, 0, 3, 6, 8, 10, 13, 15, 17, 18, 18, 19, 20, 21, 24, 26, 29, 30, 30, 31, 32, 30, 31, 31, 31, 30, 29, 29, 28, 29, 27, 25, 25, 24, 23, 23, 22, 21, 20, 19, 19, 20, 20, 20, 19, 17, 15, 14, 14, 13, 11, 10, 9, 8, 8, 10, 9, 9, 7, 5, 4, 4, 3, 2, 1, -0, -1, -2, -2, -3, -5, -5, -2, -4, -6, -8, -10, -8, -10, -14, -17, -19, -22, -24, -26, -29, -31, -34, -36, -39, -41, -45, -51, -54, -58, -60, -63, -66, -69, -72, -75, -78, -81, -83, -84, -86, -87, -86, -88, -86, -85, -87, -89, -90, -92, -91, -88, -86, -86, -80, -77, -73, -69, -65, -62, -62, -60, -59, -51, -46, -42, -38, -35, -33, -30, -27, -24, -21, -18, -14, -9, -4, -2, -0, 3, 8, 12, 17, 21, 26, 30, 34, 34, 36, 44, 48, 50, 52, 44, 46, 50, 50, 50, 50, 50, 50, 50, 51, 52, 52, 53, 53, 53, 53, 53, 53, 54, 55, 55, 43, 32, 43, 44, 43, 42, 40, 38, 37, 34, 36, 34, 31, 30, 29, 30, 27, 26, 27, 24, 24, 24, 22, 19, 18, 17, 16, 14, 14, 14, 14, 12, 11, 9, 9, - /* 15.0 */ 9, 9, 8, 9, 8, 8, 8, 8, 8, 9, 8, 10, 10, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1, -1, -2, -3, -4, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -17, -18, -20, -22, -24, -26, -28, -31, -33, -35, -36, -38, -39, -40, -41, -42, -44, -44, -45, -45, -45, -45, -44, -44, -42, -41, -39, -38, -36, -34, -32, -31, -29, -26, -23, -21, -19, -17, -15, -13, -11, -10, -9, -9, -9, -10, -5, -5, 1, 4, 2, 2, 2, 4, 4, 3, 1, -1, -1, -3, -6, -8, -10, -14, -15, -18, -21, -21, -24, -28, -30, -32, -35, -37, -38, -40, -39, -40, -42, -40, -55, -56, -49, -50, -49, -49, -47, -44, -43, -41, -38, -36, -33, -31, -28, -26, -25, -23, -21, -19, -17, -15, -13, -10, -8, -5, -3, -0, 3, 5, 8, 10, 13, 15, 18, 20, 25, 25, 21, 22, 23, 25, 28, 30, 29, 31, 32, 33, 29, 30, 30, 30, 29, 28, 28, 28, 29, 28, 26, 24, 22, 22, 23, 22, 21, 21, 20, 19, 19, 20, 20, 19, 17, 15, 15, 14, 13, 12, 10, 10, 10, 9, 11, 11, 10, 9, 7, 7, 6, 5, 4, 3, 2, 0, 0, 0, -1, -3, -3, 1, -4, -6, -7, -9, -5, -8, -12, -15, -16, -18, -21, -24, -27, -29, -32, -34, -37, -40, -45, -50, -54, -57, -58, -61, -64, -67, -70, -73, -76, -79, -81, -82, -84, -83, -84, -83, -84, -85, -87, -88, -87, -88, -89, -87, -84, -83, -79, -76, -72, -69, -64, -61, -60, -62, -56, -50, -47, -43, -39, -36, -34, -31, -29, -27, -24, -21, -17, -12, -7, -5, -3, 2, 6, 9, 14, 18, 23, 27, 31, 32, 41, 43, 41, 42, 44, 42, 45, 47, 47, 48, 48, 48, 48, 49, 49, 50, 51, 51, 52, 52, 52, 52, 52, 54, 55, 55, 50, 37, 40, 43, 44, 42, 40, 38, 36, 35, 31, 30, 29, 29, 29, 28, 25, 26, 24, 23, 22, 19, 18, 19, 16, 15, 14, 13, 13, 12, 12, 11, 10, 9, 9, - /* 16.0 */ 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 10, 10, 10, 9, 10, 9, 8, 8, 7, 6, 5, 4, 4, 4, 3, 1, -0, -2, -3, -4, -5, -6, -7, -8, -10, -11, -13, -14, -16, -17, -19, -21, -22, -24, -26, -27, -29, -32, -34, -35, -37, -39, -40, -41, -42, -43, -44, -45, -45, -46, -46, -45, -45, -44, -43, -42, -40, -38, -36, -34, -33, -31, -29, -26, -24, -21, -19, -17, -15, -15, -14, -12, -8, -3, -3, -8, -6, -2, -2, -3, -2, -1, -3, -2, -0, -1, -2, -2, -4, -5, -7, -10, -13, -15, -17, -19, -23, -25, -27, -29, -31, -34, -37, -39, -41, -42, -42, -41, -41, -42, -61, -55, -49, -46, -46, -47, -46, -44, -42, -40, -38, -34, -32, -29, -27, -25, -24, -22, -20, -18, -16, -14, -11, -8, -5, -3, -1, 3, 5, 8, 10, 13, 15, 17, 19, 21, 23, 31, 25, 24, 25, 26, 27, 30, 30, 32, 33, 32, 28, 28, 29, 29, 28, 28, 28, 28, 29, 29, 28, 27, 24, 23, 24, 23, 21, 22, 21, 21, 21, 21, 21, 19, 17, 17, 15, 14, 13, 12, 11, 10, 11, 11, 11, 12, 11, 10, 9, 8, 7, 6, 5, 5, 3, 2, 2, 1, 0, 0, 1, -1, -3, -4, -5, -6, -5, -9, -12, -15, -17, -19, -21, -23, -26, -29, -31, -33, -36, -40, -44, -47, -52, -56, -56, -59, -62, -65, -67, -70, -74, -75, -78, -80, -80, -80, -80, -80, -81, -83, -85, -85, -83, -81, -82, -84, -83, -81, -78, -75, -72, -68, -64, -61, -60, -61, -56, -51, -47, -44, -40, -37, -35, -32, -31, -30, -27, -23, -19, -14, -12, -9, -6, -1, 4, 7, 13, 16, 20, 24, 29, 31, 41, 43, 38, 33, 41, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 49, 49, 50, 51, 51, 51, 52, 52, 53, 54, 54, 53, 40, 36, 43, 42, 41, 41, 37, 35, 36, 31, 30, 29, 28, 28, 25, 24, 26, 23, 22, 20, 20, 18, 17, 16, 15, 13, 12, 12, 11, 11, 10, 9, 8, 7, - /* 17.0 */ 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 9, 9, 8, 8, 7, 6, 6, 6, 5, 5, 5, 4, 2, 0, -1, -3, -4, -5, -7, -8, -9, -10, -12, -14, -15, -17, -19, -21, -22, -23, -25, -27, -29, -31, -33, -35, -36, -38, -39, -40, -42, -43, -44, -45, -45, -46, -46, -46, -46, -45, -44, -44, -42, -40, -39, -37, -35, -33, -31, -30, -27, -24, -22, -20, -20, -19, -14, -8, -5, -3, -2, -6, -9, -7, -5, -5, -6, -5, -4, -5, -9, -9, -8, -6, -6, -7, -8, -10, -12, -14, -17, -19, -21, -25, -29, -30, -33, -38, -41, -43, -44, -45, -45, -43, -42, -41, -56, -62, -53, -49, -49, -48, -47, -44, -42, -41, -39, -36, -34, -31, -28, -25, -24, -22, -21, -19, -17, -15, -13, -10, -7, -4, -1, 2, 5, 8, 10, 13, 15, 16, 18, 21, 29, 25, 27, 25, 25, 26, 27, 27, 30, 32, 32, 34, 30, 27, 27, 28, 28, 28, 28, 28, 27, 28, 29, 28, 28, 27, 26, 25, 24, 22, 23, 22, 22, 22, 24, 23, 21, 20, 19, 17, 15, 14, 13, 11, 10, 11, 11, 12, 13, 12, 11, 10, 10, 8, 8, 7, 5, 4, 4, 3, 3, 2, 1, 0, -1, -2, -3, -4, -4, -4, -8, -12, -16, -20, -22, -23, -24, -25, -28, -32, -34, -36, -39, -42, -44, -50, -55, -55, -56, -59, -62, -64, -69, -71, -72, -75, -77, -76, -77, -78, -77, -78, -79, -79, -80, -80, -77, -75, -78, -80, -80, -77, -73, -71, -67, -63, -61, -60, -60, -58, -51, -48, -44, -41, -38, -37, -33, -32, -30, -27, -25, -20, -17, -15, -11, -8, -5, 1, 4, 8, 12, 16, 21, 25, 28, 34, 43, 41, 33, 40, 43, 42, 42, 43, 43, 44, 44, 44, 44, 45, 47, 48, 49, 50, 50, 51, 51, 51, 52, 53, 52, 49, 38, 31, 40, 44, 40, 41, 37, 37, 32, 31, 30, 28, 27, 26, 24, 23, 24, 21, 20, 19, 18, 17, 16, 14, 13, 12, 11, 11, 10, 9, 9, 8, 7, 7, - /* 18.0 */ 6, 6, 6, 7, 8, 9, 9, 8, 9, 9, 9, 10, 9, 9, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 3, 1, -1, -2, -3, -5, -6, -7, -8, -10, -11, -13, -15, -16, -18, -20, -22, -23, -25, -26, -28, -30, -32, -34, -36, -37, -39, -40, -41, -42, -43, -44, -45, -46, -46, -47, -47, -46, -46, -45, -44, -42, -41, -39, -37, -35, -33, -32, -30, -28, -25, -23, -23, -18, -14, -9, -7, -6, -4, -6, -12, -11, -13, -11, -10, -8, -7, -6, -8, -11, -11, -12, -12, -13, -11, -12, -15, -16, -15, -15, -20, -23, -25, -28, -29, -34, -38, -41, -45, -42, -42, -45, -46, -43, -49, -62, -58, -51, -48, -47, -45, -44, -42, -41, -39, -38, -35, -33, -30, -27, -24, -23, -21, -19, -18, -16, -14, -12, -9, -6, -3, -0, 3, 6, 9, 12, 14, 16, 18, 20, 22, 24, 25, 25, 26, 27, 26, 26, 26, 28, 33, 32, 35, 31, 30, 29, 28, 28, 28, 27, 27, 27, 27, 27, 29, 29, 29, 28, 27, 26, 24, 23, 23, 23, 24, 27, 25, 23, 22, 20, 18, 16, 15, 15, 13, 12, 12, 11, 11, 12, 13, 12, 11, 11, 9, 8, 7, 6, 6, 5, 4, 4, 4, 3, 0, -1, -1, -2, -2, -0, -4, -9, -14, -18, -22, -25, -27, -28, -29, -32, -34, -34, -35, -36, -40, -44, -48, -54, -53, -54, -56, -58, -62, -66, -66, -69, -72, -70, -71, -75, -74, -75, -75, -75, -75, -75, -75, -75, -72, -70, -72, -76, -74, -71, -69, -67, -63, -60, -59, -59, -55, -50, -48, -44, -42, -39, -37, -34, -32, -32, -30, -25, -21, -19, -16, -13, -8, -6, -4, 1, 5, 9, 13, 18, 22, 25, 31, 39, 37, 31, 36, 38, 40, 40, 41, 41, 41, 42, 42, 43, 43, 45, 46, 47, 48, 49, 50, 50, 50, 52, 51, 50, 44, 37, 31, 39, 41, 43, 38, 36, 33, 32, 30, 28, 26, 25, 24, 22, 21, 21, 20, 19, 18, 18, 16, 14, 12, 15, 12, 11, 10, 9, 8, 7, 7, 6, 6, - /* 19.0 */ 5, 5, 5, 5, 6, 7, 8, 9, 8, 10, 9, 10, 9, 9, 8, 8, 8, 8, 7, 8, 7, 7, 7, 6, 13, 8, -2, -2, -3, -5, -7, -8, -9, -10, -12, -14, -16, -17, -19, -21, -22, -24, -25, -27, -29, -31, -33, -35, -36, -38, -39, -40, -42, -43, -44, -44, -46, -46, -47, -47, -47, -47, -46, -45, -44, -43, -41, -39, -37, -35, -34, -32, -30, -28, -28, -25, -19, -16, -13, -11, -7, -5, -4, -6, -13, -13, -14, -12, -11, -10, -9, -7, -7, -12, -12, -14, -13, -14, -16, -16, -20, -22, -24, -26, -27, -27, -27, -28, -27, -29, -36, -44, -55, -62, -61, -55, -55, -61, -62, -57, -52, -48, -48, -47, -45, -43, -41, -40, -39, -37, -34, -32, -29, -25, -23, -21, -19, -17, -16, -14, -12, -10, -8, -5, -2, 1, 4, 8, 11, 14, 15, 17, 18, 20, 22, 23, 24, 26, 27, 27, 26, 26, 26, 29, 33, 34, 35, 32, 31, 31, 30, 28, 28, 27, 26, 26, 26, 27, 28, 30, 31, 30, 30, 28, 26, 25, 24, 23, 25, 28, 26, 25, 23, 21, 19, 18, 18, 18, 17, 16, 13, 11, 11, 12, 13, 12, 12, 13, 11, 9, 8, 8, 7, 6, 5, 5, 5, 5, 2, 1, -0, -1, 1, -0, -5, -10, -15, -19, -23, -27, -29, -31, -32, -34, -36, -37, -36, -35, -37, -42, -43, -50, -50, -52, -54, -56, -58, -60, -63, -67, -65, -67, -69, -69, -70, -70, -71, -72, -71, -72, -72, -70, -68, -65, -67, -67, -70, -68, -67, -65, -63, -60, -60, -57, -51, -49, -48, -44, -41, -39, -38, -35, -33, -31, -29, -27, -24, -21, -18, -14, -10, -7, -4, 0, 4, 7, 10, 15, 19, 22, 24, 30, 33, 30, 33, 35, 37, 38, 39, 39, 40, 40, 40, 41, 42, 43, 45, 46, 47, 49, 49, 49, 49, 51, 50, 48, 42, 35, 33, 38, 38, 38, 37, 35, 33, 31, 29, 26, 25, 23, 22, 21, 20, 19, 17, 19, 15, 17, 14, 12, 11, 10, 9, 9, 7, 7, 7, 6, 6, 6, 5, - /* 20.0 */ 4, 5, 4, 4, 4, 5, 6, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 7, 5, 6, 18, 12, -2, -3, -4, -5, -7, -8, -10, -11, -13, -15, -17, -18, -20, -22, -23, -24, -26, -28, -29, -31, -33, -35, -36, -38, -39, -41, -42, -43, -44, -45, -46, -47, -47, -48, -48, -47, -46, -46, -44, -43, -41, -40, -38, -36, -34, -32, -30, -29, -29, -21, -16, -14, -12, -10, -7, -6, -6, -10, -15, -19, -17, -16, -13, -12, -11, -10, -9, -13, -16, -15, -17, -17, -18, -19, -19, -21, -23, -25, -26, -27, -36, -37, -41, -45, -47, -51, -59, -62, -65, -63, -59, -57, -53, -50, -47, -46, -45, -46, -45, -43, -41, -40, -38, -36, -33, -30, -27, -24, -21, -18, -17, -15, -14, -12, -10, -8, -6, -4, -1, 2, 6, 9, 13, 15, 17, 18, 19, 20, 21, 23, 23, 25, 26, 25, 25, 26, 28, 31, 33, 34, 34, 34, 33, 32, 30, 29, 27, 27, 27, 27, 27, 27, 29, 30, 31, 31, 32, 30, 28, 27, 25, 24, 25, 27, 27, 25, 23, 21, 20, 20, 22, 23, 24, 20, 14, 12, 12, 12, 13, 14, 14, 14, 12, 11, 10, 9, 9, 8, 7, 6, 7, 6, 3, 2, 2, 2, 3, -1, -5, -10, -15, -20, -24, -28, -31, -33, -34, -35, -36, -37, -35, -33, -35, -39, -43, -48, -49, -50, -52, -55, -56, -57, -61, -63, -61, -64, -65, -66, -66, -67, -67, -67, -68, -68, -68, -67, -65, -65, -63, -63, -64, -64, -62, -61, -60, -57, -55, -53, -50, -51, -48, -44, -42, -39, -37, -35, -34, -31, -30, -28, -25, -23, -21, -17, -13, -9, -6, -2, 2, 5, 9, 13, 17, 20, 21, 22, 31, 28, 31, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 49, 49, 50, 49, 47, 41, 31, 36, 41, 41, 37, 36, 33, 31, 28, 28, 27, 24, 21, 22, 21, 19, 18, 15, 14, 13, 13, 11, 10, 9, 7, 8, 6, 6, 5, 7, 5, 5, 4, 4, - /* 21.0 */ 3, 2, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 9, 9, 9, 9, 8, 7, 6, 6, 12, 15, 10, -0, -2, -3, -4, -6, -8, -9, -11, -12, -14, -16, -17, -19, -20, -22, -23, -25, -27, -28, -30, -32, -34, -35, -36, -38, -40, -41, -42, -43, -45, -46, -46, -47, -48, -48, -47, -47, -47, -46, -45, -43, -42, -40, -38, -36, -34, -32, -31, -30, -28, -22, -18, -15, -13, -11, -10, -10, -13, -15, -19, -22, -21, -21, -14, -13, -14, -12, -12, -11, -18, -19, -20, -20, -22, -23, -24, -21, -23, -25, -29, -34, -42, -44, -46, -44, -48, -51, -51, -51, -52, -52, -51, -51, -51, -50, -49, -47, -45, -44, -44, -42, -41, -39, -36, -34, -31, -29, -26, -22, -19, -16, -15, -13, -12, -10, -8, -6, -4, -2, 1, 4, 7, 11, 14, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 24, 24, 25, 28, 32, 35, 36, 35, 35, 35, 33, 32, 30, 29, 28, 27, 27, 27, 27, 29, 29, 30, 31, 32, 32, 30, 29, 28, 26, 26, 28, 27, 25, 24, 22, 21, 22, 25, 29, 30, 24, 17, 14, 13, 13, 13, 15, 15, 14, 13, 11, 10, 9, 10, 9, 9, 9, 8, 6, 4, 3, 4, 6, 4, -0, -4, -8, -13, -19, -24, -28, -31, -33, -35, -35, -36, -36, -35, -34, -33, -35, -40, -43, -46, -48, -50, -55, -55, -57, -58, -57, -57, -59, -61, -62, -63, -63, -63, -63, -64, -64, -65, -65, -64, -64, -62, -60, -60, -62, -59, -58, -57, -56, -54, -52, -51, -52, -48, -43, -42, -39, -37, -36, -34, -32, -31, -29, -27, -24, -22, -19, -15, -11, -8, -4, -1, 3, 8, 12, 15, 18, 19, 21, 28, 26, 29, 31, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 42, 45, 46, 47, 48, 48, 48, 49, 48, 44, 35, 29, 38, 37, 36, 34, 33, 33, 29, 30, 26, 25, 23, 19, 19, 18, 16, 16, 14, 12, 12, 10, 9, 8, 7, 6, 5, 4, 5, 4, 5, 6, 4, 4, 3, - /* 22.0 */ 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 8, 14, 11, 7, 2, -1, -0, -1, -3, -5, -7, -9, -10, -11, -13, -15, -16, -18, -20, -21, -23, -24, -25, -27, -29, -31, -32, -34, -35, -36, -38, -39, -41, -42, -43, -45, -45, -46, -47, -47, -48, -47, -47, -47, -46, -45, -43, -42, -40, -38, -37, -35, -33, -31, -29, -25, -22, -18, -15, -13, -12, -12, -14, -16, -19, -24, -26, -24, -24, -18, -16, -15, -15, -14, -13, -18, -20, -19, -17, -18, -20, -21, -23, -24, -29, -32, -37, -38, -42, -43, -49, -51, -51, -51, -51, -52, -52, -52, -52, -51, -50, -50, -49, -47, -45, -44, -42, -40, -38, -36, -34, -31, -27, -24, -21, -17, -14, -13, -11, -10, -8, -6, -4, -2, 0, 3, 6, 9, 11, 14, 15, 17, 17, 17, 18, 19, 20, 22, 23, 24, 24, 24, 25, 27, 33, 36, 36, 36, 37, 37, 35, 33, 32, 30, 29, 27, 26, 25, 25, 27, 29, 30, 31, 32, 32, 31, 32, 31, 30, 30, 30, 27, 27, 25, 24, 23, 24, 26, 28, 28, 26, 20, 17, 15, 13, 13, 15, 15, 14, 13, 12, 11, 10, 9, 9, 10, 11, 8, 6, 5, 4, 6, 6, 4, 1, -2, -6, -10, -16, -23, -27, -31, -33, -34, -34, -34, -35, -35, -33, -32, -32, -36, -41, -42, -45, -44, -49, -52, -53, -54, -54, -54, -56, -58, -60, -60, -60, -61, -60, -59, -60, -60, -61, -62, -62, -60, -58, -58, -59, -58, -57, -57, -56, -54, -51, -51, -51, -48, -44, -42, -40, -38, -37, -34, -33, -30, -30, -29, -26, -23, -20, -17, -14, -10, -6, -2, 1, 5, 10, 14, 17, 19, 22, 23, 24, 27, 28, 30, 32, 34, 35, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 48, 47, 49, 47, 43, 33, 26, 32, 37, 37, 36, 34, 32, 30, 27, 26, 23, 22, 20, 19, 17, 16, 15, 13, 11, 10, 8, 7, 7, 6, 5, 4, 3, 3, 2, 4, 2, 2, 3, 2, 1, - /* 23.0 */ -1, -1, -0, 1, 1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 7, 8, 10, 11, 12, 7, 4, 4, 3, 3, 3, 2, -0, -3, -6, -8, -9, -11, -12, -14, -16, -17, -18, -20, -21, -22, -24, -26, -27, -29, -31, -33, -34, -35, -36, -38, -40, -41, -42, -43, -45, -46, -46, -47, -47, -48, -47, -47, -46, -46, -45, -43, -42, -40, -39, -37, -33, -33, -31, -28, -25, -21, -18, -16, -14, -13, -13, -16, -18, -22, -26, -29, -27, -26, -27, -25, -20, -16, -17, -18, -19, -23, -23, -22, -22, -23, -24, -25, -24, -27, -30, -36, -39, -44, -47, -49, -50, -51, -51, -52, -52, -52, -53, -53, -52, -51, -50, -49, -47, -46, -44, -42, -39, -37, -34, -31, -29, -26, -22, -19, -16, -12, -11, -9, -8, -6, -4, -2, -1, 2, 4, 7, 9, 11, 13, 15, 16, 17, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 29, 33, 36, 38, 37, 39, 38, 36, 35, 33, 31, 29, 28, 26, 25, 25, 27, 27, 30, 32, 32, 33, 33, 34, 36, 34, 33, 31, 29, 29, 27, 25, 25, 26, 27, 27, 27, 25, 22, 19, 16, 14, 14, 14, 15, 14, 13, 13, 11, 10, 10, 9, 11, 11, 8, 7, 6, 6, 7, 6, 5, 2, 0, -3, -8, -13, -20, -26, -30, -32, -33, -33, -33, -33, -33, -30, -28, -30, -38, -40, -43, -46, -45, -47, -47, -48, -50, -51, -52, -53, -55, -56, -57, -56, -57, -58, -59, -60, -58, -59, -60, -60, -57, -55, -56, -56, -57, -56, -56, -55, -54, -51, -51, -51, -48, -44, -43, -41, -39, -37, -35, -33, -31, -30, -29, -28, -26, -22, -19, -15, -12, -8, -4, -0, 4, 8, 13, 16, 19, 26, 20, 17, 19, 22, 26, 30, 32, 34, 35, 36, 37, 38, 39, 40, 39, 42, 44, 46, 47, 48, 47, 40, 33, 27, 31, 35, 36, 35, 34, 31, 29, 31, 25, 24, 23, 21, 19, 15, 14, 13, 12, 11, 9, 8, 7, 5, 4, 3, 2, 2, 1, 1, 1, -0, 1, 0, -0, -1, -1, - /* 24.0 */ -2, -2, -1, -0, 0, 2, 2, 3, 4, 4, 4, 6, 7, 12, 14, 10, 7, 5, 5, 4, 4, 4, 4, 3, 2, 1, -2, -5, -7, -9, -10, -11, -13, -14, -16, -17, -19, -20, -21, -22, -24, -26, -28, -29, -31, -33, -34, -36, -37, -39, -40, -41, -42, -43, -44, -45, -46, -47, -47, -47, -47, -47, -46, -45, -44, -43, -42, -41, -37, -35, -33, -33, -30, -27, -22, -19, -18, -17, -15, -14, -13, -18, -20, -23, -28, -31, -31, -28, -28, -29, -28, -24, -21, -23, -24, -26, -25, -25, -26, -26, -26, -27, -27, -32, -34, -39, -43, -45, -48, -50, -51, -52, -52, -52, -51, -52, -52, -53, -52, -51, -50, -49, -47, -46, -44, -41, -39, -36, -34, -31, -28, -25, -21, -17, -13, -11, -9, -7, -5, -3, -2, 0, 2, 3, 5, 7, 9, 11, 14, 16, 17, 18, 19, 20, 20, 22, 23, 24, 25, 27, 28, 30, 31, 33, 35, 37, 40, 39, 38, 38, 36, 34, 33, 31, 30, 29, 27, 26, 26, 28, 29, 31, 32, 33, 34, 36, 37, 37, 35, 34, 33, 30, 28, 26, 26, 26, 27, 27, 26, 25, 22, 20, 17, 15, 14, 15, 14, 14, 13, 13, 12, 12, 11, 10, 11, 11, 9, 8, 8, 8, 8, 8, 6, 4, 2, -2, -5, -11, -18, -24, -28, -31, -33, -33, -33, -33, -30, -27, -30, -36, -37, -39, -42, -45, -47, -48, -45, -46, -46, -48, -48, -49, -51, -52, -53, -54, -55, -55, -56, -58, -58, -59, -59, -59, -58, -57, -56, -55, -56, -56, -55, -55, -55, -52, -51, -51, -49, -46, -43, -41, -39, -37, -36, -33, -32, -32, -31, -29, -27, -24, -20, -17, -13, -10, -6, -2, 2, 6, 10, 14, 17, 24, 15, 18, 21, 23, 27, 25, 29, 32, 35, 36, 37, 37, 37, 38, 39, 42, 44, 45, 46, 48, 44, 35, 29, 36, 37, 35, 34, 32, 33, 30, 28, 25, 24, 21, 20, 19, 16, 16, 13, 12, 11, 9, 7, 5, 4, 3, 2, 1, 1, -0, -1, -1, -1, -1, -2, -2, -3, -2, -2, - /* 25.0 */ -3, -2, -1, -1, -1, -0, 1, 0, 5, 6, 7, 6, 14, 7, 3, 4, 4, 4, 4, 4, 3, 3, 2, 1, -0, -2, -4, -7, -8, -10, -11, -12, -14, -15, -16, -17, -19, -20, -21, -23, -25, -26, -28, -30, -31, -33, -34, -36, -38, -39, -41, -42, -43, -44, -45, -46, -46, -47, -47, -47, -47, -46, -45, -45, -43, -43, -41, -39, -37, -34, -35, -33, -30, -26, -22, -21, -20, -19, -16, -15, -16, -19, -23, -22, -27, -32, -32, -30, -28, -27, -27, -28, -28, -26, -24, -27, -23, -23, -24, -24, -28, -28, -32, -33, -39, -43, -44, -47, -49, -51, -52, -52, -52, -51, -51, -51, -51, -52, -52, -51, -49, -48, -47, -45, -43, -41, -38, -35, -33, -29, -26, -22, -19, -15, -11, -8, -7, -4, -2, -0, 1, 3, 5, 6, 8, 9, 11, 13, 15, 17, 18, 19, 21, 21, 21, 22, 23, 25, 26, 28, 31, 33, 33, 31, 34, 34, 37, 39, 40, 39, 38, 36, 34, 32, 31, 30, 29, 28, 27, 27, 27, 28, 28, 30, 33, 35, 36, 36, 36, 35, 33, 30, 29, 27, 26, 25, 27, 28, 26, 25, 22, 20, 19, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 12, 13, 12, 10, 9, 10, 10, 10, 9, 8, 5, 2, -2, -5, -10, -16, -22, -27, -30, -31, -32, -33, -33, -28, -27, -29, -30, -32, -32, -34, -36, -38, -42, -43, -43, -45, -46, -46, -46, -48, -49, -48, -52, -54, -54, -56, -59, -60, -60, -60, -62, -62, -62, -61, -59, -56, -55, -54, -53, -52, -51, -50, -51, -49, -45, -41, -40, -39, -37, -35, -33, -31, -32, -32, -30, -27, -25, -21, -17, -14, -11, -7, -4, 1, 5, 9, 12, 15, 18, 20, 22, 25, 28, 26, 25, 24, 29, 33, 36, 34, 36, 37, 37, 39, 41, 43, 44, 46, 47, 42, 33, 38, 38, 35, 34, 32, 31, 28, 27, 26, 24, 21, 19, 17, 15, 14, 13, 10, 9, 9, 7, 5, 3, 2, 1, 0, -1, -1, -2, -3, -3, -3, -4, -4, -4, -4, -3, -3, - /* 26.0 */ -4, -3, -3, -2, -2, -1, 6, 2, 5, 6, 3, 5, 5, 3, 4, 4, 4, 3, 3, 2, 2, 1, -0, -2, -3, -5, -7, -8, -9, -11, -12, -13, -14, -15, -17, -18, -19, -20, -22, -23, -25, -27, -28, -30, -32, -33, -35, -36, -38, -39, -41, -42, -43, -44, -45, -46, -46, -46, -46, -46, -46, -46, -45, -44, -43, -42, -41, -37, -36, -35, -35, -31, -29, -24, -21, -21, -21, -20, -18, -19, -20, -23, -25, -23, -27, -33, -31, -29, -29, -29, -27, -26, -26, -25, -26, -28, -25, -25, -24, -26, -28, -30, -33, -39, -44, -43, -45, -48, -50, -51, -53, -52, -51, -50, -50, -50, -50, -51, -51, -50, -49, -47, -46, -44, -42, -39, -37, -34, -31, -28, -24, -21, -17, -13, -10, -6, -4, -2, 1, 2, 4, 6, 7, 9, 11, 12, 13, 15, 17, 19, 20, 22, 23, 24, 24, 24, 25, 26, 27, 29, 32, 34, 34, 31, 31, 34, 36, 39, 39, 40, 40, 37, 35, 33, 32, 32, 31, 30, 28, 27, 26, 26, 26, 28, 30, 32, 34, 33, 33, 32, 31, 29, 28, 27, 26, 26, 28, 30, 28, 26, 24, 22, 21, 19, 17, 15, 14, 13, 13, 12, 13, 13, 13, 13, 14, 12, 11, 13, 12, 12, 11, 10, 8, 5, 2, -1, -5, -10, -15, -21, -26, -28, -30, -31, -32, -33, -31, -26, -22, -24, -26, -28, -30, -31, -31, -35, -40, -42, -44, -45, -45, -45, -46, -48, -48, -49, -53, -55, -57, -59, -61, -62, -64, -66, -66, -65, -64, -62, -58, -53, -50, -49, -48, -53, -55, -52, -49, -46, -42, -39, -38, -37, -36, -33, -31, -31, -30, -28, -26, -24, -21, -19, -16, -13, -9, -6, -1, 3, 7, 10, 13, 16, 19, 22, 26, 28, 29, 29, 28, 25, 28, 33, 36, 36, 36, 37, 39, 40, 42, 43, 44, 43, 39, 35, 39, 38, 36, 34, 32, 28, 27, 26, 24, 22, 19, 17, 14, 13, 11, 10, 8, 7, 6, 5, 3, 2, 1, -0, -2, -3, -3, -4, -5, -5, -5, -5, -5, -5, -4, -4, -4, - /* 27.0 */ -4, -5, -4, -1, -1, -3, -3, -3, -1, -1, 1, 2, 2, 3, 3, 3, 2, 1, 0, 0, -1, -2, -3, -5, -6, -7, -8, -10, -11, -12, -13, -14, -15, -16, -17, -18, -20, -21, -23, -24, -26, -28, -29, -31, -32, -33, -35, -36, -38, -39, -41, -42, -43, -44, -45, -45, -45, -46, -46, -46, -45, -45, -44, -43, -43, -43, -38, -37, -36, -36, -33, -31, -27, -24, -23, -22, -21, -20, -20, -21, -22, -25, -26, -25, -28, -31, -30, -29, -29, -29, -27, -26, -26, -27, -29, -27, -25, -26, -26, -27, -30, -30, -33, -38, -44, -44, -45, -48, -50, -52, -52, -52, -51, -49, -49, -49, -49, -49, -49, -49, -48, -46, -45, -43, -41, -38, -35, -33, -30, -26, -23, -19, -15, -12, -8, -4, -1, 1, 3, 5, 7, 8, 10, 12, 14, 15, 17, 18, 20, 21, 23, 23, 25, 26, 26, 26, 25, 26, 28, 30, 31, 34, 34, 33, 32, 32, 36, 38, 39, 39, 40, 38, 38, 35, 33, 33, 33, 32, 30, 27, 26, 26, 25, 26, 27, 29, 30, 30, 30, 30, 29, 29, 28, 27, 27, 28, 30, 31, 30, 27, 25, 23, 22, 20, 18, 16, 15, 14, 14, 14, 13, 13, 13, 14, 13, 12, 14, 15, 14, 12, 11, 10, 7, 4, 1, -2, -6, -10, -15, -20, -25, -27, -29, -28, -26, -26, -30, -28, -20, -22, -24, -25, -27, -29, -31, -31, -35, -40, -45, -43, -45, -45, -44, -46, -48, -47, -50, -54, -57, -60, -63, -66, -67, -67, -67, -65, -59, -51, -47, -41, -41, -42, -42, -47, -56, -56, -51, -46, -44, -40, -36, -35, -35, -34, -32, -31, -31, -29, -27, -24, -22, -19, -18, -15, -11, -7, -4, 1, 5, 9, 12, 15, 17, 21, 24, 27, 30, 31, 32, 26, 24, 29, 33, 35, 35, 37, 39, 40, 42, 43, 44, 42, 46, 33, 33, 35, 34, 32, 29, 28, 25, 23, 22, 18, 16, 15, 13, 11, 10, 8, 7, 5, 4, 3, 1, 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -6, -5, -5, -4, -4, -4, - /* 28.0 */ -5, -4, -0, -2, 1, -4, -5, -3, -2, -1, -0, 0, 1, 1, 0, -0, -1, -2, -2, -3, -3, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -14, -15, -16, -18, -19, -21, -22, -24, -25, -27, -28, -30, -31, -32, -34, -35, -36, -38, -39, -40, -42, -43, -44, -44, -44, -45, -45, -45, -45, -44, -44, -43, -43, -43, -37, -37, -35, -36, -34, -32, -29, -25, -24, -24, -23, -22, -21, -21, -23, -24, -26, -28, -28, -27, -28, -27, -26, -26, -25, -26, -27, -30, -31, -30, -26, -25, -26, -28, -30, -31, -34, -36, -38, -45, -45, -46, -48, -50, -52, -52, -51, -50, -48, -48, -47, -47, -47, -47, -46, -46, -44, -43, -41, -39, -36, -34, -31, -28, -25, -21, -18, -14, -10, -6, -2, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 20, 21, 23, 25, 26, 26, 26, 27, 27, 27, 27, 27, 28, 30, 31, 34, 38, 45, 44, 41, 41, 39, 39, 39, 39, 39, 38, 36, 36, 36, 36, 34, 31, 30, 28, 28, 27, 27, 28, 28, 28, 28, 29, 29, 28, 28, 29, 29, 29, 30, 30, 30, 29, 26, 25, 23, 22, 21, 20, 17, 15, 15, 15, 15, 15, 14, 14, 13, 11, 13, 18, 17, 14, 12, 10, 8, 6, 3, -0, -3, -7, -11, -15, -19, -23, -26, -24, -21, -19, -19, -21, -19, -18, -20, -20, -21, -25, -30, -32, -32, -32, -38, -44, -42, -45, -48, -47, -47, -46, -47, -48, -53, -56, -60, -63, -63, -58, -55, -53, -45, -33, -29, -29, -29, -30, -31, -30, -34, -41, -48, -49, -42, -40, -37, -34, -32, -33, -35, -37, -37, -35, -31, -28, -25, -23, -20, -19, -16, -12, -9, -5, -1, 3, 7, 10, 13, 16, 20, 23, 26, 29, 31, 31, 29, 25, 26, 33, 35, 35, 37, 38, 40, 41, 42, 43, 40, 48, 32, 30, 32, 33, 30, 28, 24, 22, 21, 18, 17, 15, 13, 11, 9, 8, 6, 5, 4, 3, 1, 0, -1, -2, -3, -4, -5, -6, -7, -7, -7, -7, -6, -6, -5, -5, -5, -5, - /* 29.0 */ -5, -3, -5, -6, -5, -6, -4, -4, -3, -3, -3, -2, -2, -3, -3, -3, -4, -4, -4, -6, -7, -8, -9, -10, -10, -11, -12, -12, -13, -13, -15, -16, -17, -17, -19, -20, -22, -23, -25, -26, -27, -29, -30, -31, -33, -34, -35, -36, -38, -39, -41, -42, -43, -43, -44, -44, -44, -44, -44, -44, -43, -43, -42, -42, -41, -38, -35, -37, -35, -33, -31, -29, -25, -24, -25, -24, -23, -22, -22, -24, -24, -25, -27, -29, -28, -27, -27, -26, -25, -25, -25, -25, -29, -29, -27, -28, -28, -29, -29, -30, -32, -35, -37, -41, -46, -46, -47, -48, -51, -52, -52, -51, -49, -48, -47, -46, -45, -45, -44, -44, -43, -42, -40, -38, -37, -34, -32, -29, -26, -23, -19, -16, -12, -8, -4, -0, 4, 7, 9, 11, 13, 15, 16, 18, 20, 22, 23, 25, 26, 27, 28, 28, 27, 28, 29, 29, 29, 29, 30, 32, 32, 34, 39, 37, 37, 36, 42, 42, 41, 41, 42, 42, 40, 40, 40, 40, 40, 38, 36, 34, 31, 29, 28, 28, 28, 27, 27, 27, 27, 28, 29, 28, 29, 30, 31, 31, 30, 29, 29, 26, 25, 23, 22, 23, 21, 20, 18, 16, 15, 16, 16, 15, 16, 14, 13, 15, 20, 17, 14, 12, 10, 8, 5, 2, -0, -3, -7, -11, -15, -18, -21, -21, -15, -12, -13, -11, -8, -7, -11, -17, -17, -17, -22, -25, -27, -30, -30, -34, -42, -39, -45, -50, -49, -48, -47, -47, -49, -51, -55, -57, -55, -48, -40, -34, -31, -29, -30, -30, -31, -33, -34, -33, -32, -31, -30, -40, -44, -40, -37, -34, -32, -31, -32, -38, -43, -42, -39, -34, -30, -27, -24, -21, -20, -18, -13, -9, -6, -2, 2, 6, 8, 12, 15, 19, 22, 24, 27, 29, 30, 30, 26, 24, 29, 33, 36, 36, 38, 39, 40, 42, 43, 36, 37, 23, 30, 32, 30, 28, 25, 23, 21, 20, 17, 16, 13, 11, 10, 9, 7, 5, 4, 3, 2, 1, -1, -3, -3, -5, -5, -6, -6, -7, -7, -7, -7, -6, -6, -6, -6, -6, -5, - /* 30.0 */ -8, -8, -8, -8, -7, -8, -6, -6, -6, -5, -5, -6, -6, -6, -6, -6, -6, -7, -7, -8, -9, -10, -11, -11, -12, -12, -13, -13, -14, -15, -16, -17, -17, -18, -20, -21, -23, -24, -25, -27, -28, -29, -31, -32, -33, -34, -36, -37, -38, -39, -40, -41, -42, -42, -43, -43, -43, -43, -43, -43, -42, -42, -41, -40, -38, -35, -37, -35, -33, -31, -30, -28, -25, -25, -25, -24, -22, -23, -24, -24, -23, -24, -27, -28, -29, -29, -28, -28, -28, -28, -27, -28, -28, -28, -28, -29, -29, -29, -29, -30, -32, -36, -39, -41, -46, -46, -47, -49, -51, -52, -52, -51, -49, -47, -46, -45, -43, -42, -42, -41, -41, -40, -38, -36, -35, -33, -30, -28, -25, -21, -18, -14, -10, -6, -3, 1, 5, 9, 12, 14, 16, 18, 20, 22, 23, 25, 26, 28, 29, 30, 30, 33, 33, 30, 31, 30, 30, 31, 32, 33, 34, 35, 35, 37, 39, 40, 41, 44, 42, 40, 43, 47, 49, 48, 47, 46, 44, 41, 39, 38, 35, 33, 30, 29, 27, 26, 26, 26, 27, 27, 28, 29, 30, 31, 31, 30, 30, 29, 28, 27, 26, 24, 23, 22, 22, 21, 21, 18, 17, 17, 16, 16, 16, 17, 17, 17, 19, 17, 14, 12, 10, 7, 5, 2, -0, -4, -8, -13, -15, -17, -18, -13, -7, -8, -8, -6, -6, -7, -13, -16, -15, -19, -22, -23, -24, -27, -28, -28, -34, -33, -39, -49, -49, -47, -46, -46, -48, -50, -48, -39, -35, -29, -25, -26, -27, -28, -30, -30, -31, -33, -34, -35, -35, -34, -35, -38, -38, -36, -35, -34, -32, -31, -32, -41, -44, -42, -41, -38, -32, -27, -24, -22, -22, -19, -15, -11, -7, -3, 1, 4, 7, 10, 14, 17, 21, 23, 25, 28, 30, 31, 30, 26, 27, 32, 34, 36, 37, 39, 39, 42, 42, 35, 25, 23, 30, 30, 28, 26, 23, 21, 19, 17, 16, 14, 12, 11, 9, 8, 6, 4, 3, 2, -0, -1, -3, -4, -5, -6, -6, -7, -7, -7, -7, -7, -6, -7, -7, -7, -7, -5, -8, - /* 31.0 */ -8, -9, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -9, -9, -10, -11, -12, -13, -13, -13, -13, -14, -15, -15, -16, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -33, -35, -36, -37, -38, -39, -40, -41, -41, -42, -42, -42, -42, -42, -42, -42, -41, -41, -40, -38, -34, -35, -36, -34, -32, -30, -28, -27, -26, -26, -24, -24, -23, -24, -25, -24, -24, -25, -27, -27, -28, -28, -29, -28, -28, -28, -28, -29, -29, -29, -28, -29, -29, -29, -30, -31, -34, -36, -40, -43, -44, -44, -48, -51, -52, -52, -51, -50, -48, -46, -45, -43, -42, -40, -40, -39, -39, -38, -36, -35, -33, -31, -28, -26, -23, -19, -16, -12, -8, -5, -1, 3, 7, 11, 14, 18, 20, 22, 24, 25, 27, 28, 29, 30, 32, 32, 32, 34, 32, 32, 32, 31, 30, 32, 33, 35, 36, 37, 37, 38, 39, 41, 44, 44, 44, 43, 46, 51, 53, 54, 52, 50, 48, 46, 43, 42, 39, 37, 34, 32, 29, 27, 27, 27, 27, 28, 29, 31, 32, 31, 31, 30, 29, 28, 28, 27, 27, 26, 24, 23, 22, 21, 21, 19, 17, 15, 15, 16, 16, 17, 17, 18, 20, 18, 16, 14, 12, 9, 5, 2, -1, -6, -10, -14, -16, -16, -11, -5, -3, -4, -5, -5, -7, -9, -14, -14, -15, -19, -21, -22, -23, -25, -26, -25, -26, -31, -37, -48, -47, -45, -44, -46, -48, -44, -36, -24, -22, -24, -26, -28, -29, -30, -31, -31, -33, -34, -35, -36, -36, -37, -36, -37, -38, -37, -36, -34, -32, -31, -31, -33, -41, -43, -42, -39, -35, -29, -24, -23, -22, -20, -16, -12, -8, -4, -1, 3, 6, 9, 13, 16, 19, 22, 24, 27, 29, 30, 31, 29, 27, 30, 33, 36, 37, 38, 39, 42, 42, 35, 20, 24, 29, 28, 26, 24, 22, 20, 18, 16, 14, 13, 11, 10, 9, 7, 6, 4, 3, 1, -1, -3, -4, -5, -7, -7, -8, -8, -8, -8, -9, -8, -8, -8, -6, -8, -8, -9, -8, - /* 32.0 */ -9, -10, -9, -9, -10, -10, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -10, -11, -11, -12, -13, -14, -14, -14, -14, -15, -16, -17, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -33, -34, -36, -37, -38, -39, -40, -40, -40, -41, -41, -42, -42, -42, -42, -42, -41, -41, -39, -38, -37, -33, -35, -34, -33, -31, -30, -28, -27, -26, -25, -24, -23, -26, -24, -26, -26, -27, -28, -28, -28, -27, -28, -27, -27, -27, -27, -27, -28, -29, -29, -28, -27, -28, -29, -31, -33, -34, -37, -39, -41, -43, -46, -50, -51, -51, -51, -50, -48, -47, -45, -43, -37, -40, -39, -37, -37, -37, -36, -35, -34, -31, -29, -26, -24, -21, -18, -14, -10, -7, -3, 1, 4, 8, 12, 16, 20, 23, 25, 27, 28, 30, 31, 33, 34, 35, 36, 36, 36, 38, 34, 34, 33, 33, 33, 34, 36, 38, 39, 40, 41, 40, 40, 42, 43, 43, 44, 46, 48, 49, 50, 55, 54, 51, 48, 47, 44, 41, 39, 38, 36, 32, 30, 28, 28, 29, 30, 32, 33, 32, 33, 32, 30, 29, 27, 27, 27, 29, 30, 27, 25, 22, 18, 14, 11, 11, 12, 16, 19, 17, 17, 16, 20, 21, 20, 19, 18, 15, 11, 7, 2, -2, -7, -10, -12, -14, -12, -4, -1, -1, -2, -3, -5, -6, -10, -12, -12, -14, -18, -21, -22, -24, -24, -25, -25, -26, -31, -40, -45, -43, -43, -44, -46, -46, -35, -28, -25, -24, -26, -28, -29, -30, -31, -32, -33, -35, -37, -37, -37, -37, -38, -38, -39, -39, -39, -37, -34, -34, -32, -32, -31, -35, -41, -41, -38, -34, -29, -26, -24, -24, -21, -17, -13, -9, -6, -2, 2, 5, 9, 12, 15, 18, 21, 24, 26, 29, 30, 32, 31, 26, 31, 33, 33, 36, 37, 39, 42, 42, 33, 16, 25, 29, 28, 26, 24, 22, 20, 17, 16, 13, 12, 11, 9, 8, 7, 6, 4, 1, -1, -3, -4, -6, -7, -8, -8, -9, -8, -8, -9, -8, -5, -9, -9, -9, -9, -9, -9, -9, - /* 33.0 */ -9, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -12, -13, -13, -14, -14, -15, -15, -15, -15, -16, -17, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -29, -30, -32, -33, -34, -35, -36, -37, -38, -39, -39, -40, -41, -41, -41, -41, -42, -41, -41, -41, -40, -38, -38, -37, -33, -34, -34, -33, -32, -31, -29, -28, -26, -24, -24, -22, -22, -24, -22, -25, -27, -30, -30, -30, -28, -27, -28, -28, -27, -27, -27, -28, -29, -30, -30, -30, -30, -29, -29, -31, -33, -34, -36, -39, -40, -44, -48, -50, -51, -51, -50, -49, -47, -46, -44, -42, -40, -38, -38, -36, -35, -35, -34, -32, -31, -29, -27, -25, -22, -18, -16, -12, -9, -5, -1, 3, 6, 10, 14, 17, 21, 25, 28, 30, 32, 33, 34, 36, 37, 38, 39, 39, 40, 38, 38, 38, 37, 35, 35, 35, 36, 40, 43, 45, 48, 45, 43, 41, 42, 42, 41, 39, 46, 48, 51, 52, 55, 52, 52, 50, 48, 45, 42, 40, 39, 36, 32, 30, 29, 29, 31, 33, 33, 33, 32, 31, 30, 29, 28, 27, 27, 28, 28, 29, 23, 14, 10, 7, 7, 7, 9, 12, 14, 15, 16, 16, 20, 24, 24, 21, 19, 17, 13, 8, 3, -1, -4, -5, -3, -3, -0, 4, 3, 1, -1, -4, -5, -8, -10, -12, -12, -14, -19, -21, -21, -21, -23, -24, -23, -26, -29, -37, -45, -47, -47, -45, -40, -34, -27, -23, -24, -25, -27, -29, -30, -31, -32, -33, -34, -36, -37, -38, -38, -38, -39, -39, -40, -40, -40, -37, -36, -35, -34, -34, -33, -34, -38, -39, -36, -34, -31, -28, -26, -23, -21, -18, -15, -11, -6, -2, 1, 5, 8, 11, 15, 18, 21, 24, 26, 28, 31, 32, 33, 31, 34, 35, 34, 34, 36, 37, 41, 43, 34, 15, 24, 28, 27, 25, 23, 21, 18, 16, 14, 13, 10, 9, 7, 6, 5, 5, 3, 0, -2, -4, -6, -7, -8, -9, -9, -9, -9, -10, -10, -7, -9, -9, -9, -9, -9, -9, -9, -9, - /* 34.0 */ -10, -10, -9, -10, -10, -11, -12, -12, -12, -12, -13, -13, -12, -12, -12, -12, -12, -13, -13, -14, -14, -15, -15, -16, -16, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -29, -29, -31, -32, -32, -34, -35, -36, -37, -38, -39, -40, -40, -41, -41, -41, -41, -41, -41, -41, -41, -40, -39, -37, -37, -34, -32, -32, -33, -31, -30, -29, -26, -24, -23, -22, -23, -21, -23, -24, -24, -26, -28, -29, -30, -27, -27, -29, -30, -29, -28, -27, -28, -27, -28, -28, -29, -30, -30, -31, -31, -31, -32, -34, -36, -39, -40, -41, -47, -48, -48, -49, -48, -47, -46, -45, -43, -42, -40, -38, -37, -35, -34, -33, -32, -30, -29, -28, -25, -22, -20, -16, -13, -10, -6, -3, 1, 4, 8, 11, 15, 18, 22, 26, 29, 32, 35, 36, 38, 39, 40, 41, 41, 42, 42, 42, 42, 40, 38, 38, 38, 38, 38, 40, 42, 43, 44, 46, 45, 43, 42, 41, 40, 37, 38, 43, 45, 46, 48, 52, 51, 51, 50, 48, 46, 45, 42, 39, 34, 31, 29, 30, 32, 33, 34, 33, 33, 32, 32, 31, 29, 28, 26, 25, 23, 19, 13, 9, 9, 6, 1, 1, 5, 8, 10, 13, 14, 15, 18, 28, 26, 22, 20, 18, 14, 10, 6, 1, 0, 4, 5, 5, 6, 6, 4, -1, -3, -5, -7, -10, -11, -12, -14, -17, -20, -21, -20, -20, -21, -22, -22, -23, -28, -35, -42, -48, -44, -38, -32, -25, -25, -23, -24, -25, -26, -28, -30, -32, -34, -34, -36, -37, -38, -39, -39, -40, -41, -41, -41, -41, -40, -39, -38, -36, -36, -36, -36, -36, -38, -38, -36, -35, -33, -28, -25, -23, -21, -19, -15, -11, -7, -3, 1, 5, 8, 11, 14, 18, 21, 24, 26, 28, 30, 31, 32, 32, 34, 37, 37, 40, 36, 37, 40, 39, 25, 11, 23, 27, 25, 24, 21, 19, 17, 16, 14, 11, 9, 7, 5, 4, 4, 3, 2, -0, -2, -4, -6, -8, -8, -9, -10, -9, -10, -12, -12, -9, -11, -9, -8, -9, -9, -9, -8, -10, - /* 35.0 */ -10, -10, -10, -10, -10, -12, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -14, -14, -14, -15, -15, -16, -16, -16, -17, -18, -19, -20, -21, -22, -23, -23, -24, -26, -27, -28, -29, -30, -32, -33, -33, -34, -35, -36, -38, -39, -39, -40, -40, -40, -41, -41, -41, -41, -41, -40, -39, -39, -36, -34, -33, -32, -32, -31, -30, -29, -27, -25, -24, -24, -23, -21, -22, -20, -22, -24, -25, -27, -28, -28, -27, -28, -27, -30, -32, -32, -30, -28, -28, -28, -29, -28, -29, -30, -31, -30, -31, -33, -32, -32, -35, -37, -39, -40, -43, -45, -47, -46, -46, -45, -45, -44, -42, -40, -39, -37, -36, -34, -33, -31, -30, -29, -27, -26, -23, -20, -18, -15, -11, -8, -4, -1, 2, 6, 9, 13, 16, 20, 23, 27, 30, 34, 37, 39, 41, 42, 43, 44, 45, 44, 45, 46, 44, 43, 43, 42, 41, 41, 40, 41, 42, 44, 47, 48, 46, 46, 48, 47, 44, 43, 41, 41, 40, 40, 44, 48, 50, 50, 50, 50, 49, 47, 44, 42, 37, 36, 37, 38, 37, 37, 36, 36, 36, 34, 34, 33, 29, 28, 26, 23, 17, 12, 9, 17, 20, 17, 10, 6, 6, 7, 7, 17, 28, 24, 19, 24, 26, 25, 22, 20, 17, 13, 10, 6, 6, 9, 11, 11, 9, 6, 1, -2, -5, -7, -9, -11, -12, -14, -16, -17, -21, -22, -23, -22, -22, -22, -23, -25, -29, -32, -35, -37, -35, -32, -28, -27, -23, -22, -22, -25, -26, -29, -32, -33, -35, -36, -37, -38, -39, -40, -41, -42, -43, -43, -42, -42, -42, -41, -40, -40, -39, -38, -38, -39, -39, -38, -36, -35, -34, -32, -27, -22, -21, -19, -16, -11, -7, -2, 2, 4, 7, 11, 14, 17, 20, 22, 25, 28, 29, 30, 31, 33, 35, 36, 36, 37, 37, 41, 39, 34, 23, 13, 20, 24, 23, 22, 21, 19, 17, 15, 12, 10, 8, 6, 5, 4, 3, 1, -1, -2, -3, -5, -6, -8, -9, -10, -10, -10, -10, -12, -9, -4, -13, -10, -10, -10, -10, -9, -10, -10, - /* 36.0 */ -11, -11, -11, -12, -12, -12, -13, -13, -13, -14, -14, -14, -14, -14, -13, -13, -13, -14, -14, -15, -15, -15, -16, -16, -17, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -29, -30, -31, -32, -33, -34, -35, -36, -37, -37, -39, -39, -39, -40, -40, -40, -40, -40, -40, -40, -39, -38, -36, -33, -34, -32, -29, -30, -29, -29, -27, -25, -23, -23, -21, -20, -21, -20, -19, -19, -21, -24, -27, -28, -29, -29, -28, -29, -30, -30, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -32, -32, -32, -34, -33, -32, -36, -37, -40, -40, -43, -44, -44, -44, -43, -43, -42, -41, -39, -38, -37, -35, -33, -31, -30, -29, -27, -26, -23, -21, -18, -16, -11, -9, -5, -3, 0, 4, 7, 11, 14, 18, 22, 25, 28, 31, 34, 38, 41, 43, 46, 47, 47, 48, 48, 48, 49, 48, 48, 48, 47, 45, 44, 43, 41, 42, 43, 45, 47, 49, 46, 46, 47, 44, 43, 45, 45, 42, 42, 42, 46, 48, 48, 47, 47, 48, 48, 46, 44, 43, 43, 43, 43, 42, 40, 39, 39, 38, 37, 38, 31, 29, 29, 27, 21, 14, 11, 19, 28, 31, 29, 25, 16, 12, 15, 15, 21, 27, 25, 23, 25, 27, 26, 24, 22, 20, 16, 14, 13, 13, 15, 15, 12, 10, 5, 5, 1, -2, -4, -8, -10, -12, -13, -15, -18, -23, -27, -28, -29, -30, -30, -31, -32, -35, -29, -28, -30, -30, -31, -30, -26, -21, -24, -25, -30, -33, -33, -32, -34, -36, -37, -38, -39, -41, -42, -43, -44, -45, -46, -48, -47, -48, -47, -44, -46, -44, -43, -43, -42, -40, -37, -36, -34, -31, -29, -26, -22, -17, -17, -15, -12, -7, -2, 2, 4, 8, 10, 13, 16, 19, 22, 24, 27, 30, 28, 28, 30, 33, 33, 34, 36, 40, 42, 41, 38, 31, 19, 16, 22, 22, 22, 21, 19, 16, 14, 12, 10, 8, 6, 5, 3, 2, 2, 0, -2, -4, -5, -6, -7, -8, -9, -10, -10, -10, -12, -11, -11, -12, -11, -11, -11, -11, -10, -11, -11, - /* 37.0 */ -12, -12, -12, -13, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -14, -14, -15, -15, -15, -16, -16, -17, -18, -18, -20, -20, -21, -22, -23, -24, -25, -26, -27, -29, -30, -31, -33, -34, -35, -36, -37, -37, -37, -38, -39, -39, -39, -40, -40, -40, -40, -39, -39, -38, -37, -33, -33, -32, -27, -27, -28, -27, -27, -26, -23, -23, -23, -22, -21, -21, -19, -17, -17, -20, -23, -26, -28, -28, -29, -29, -30, -30, -31, -30, -30, -30, -31, -30, -29, -30, -31, -32, -32, -31, -32, -32, -32, -33, -33, -34, -36, -39, -39, -42, -43, -43, -43, -42, -42, -42, -40, -39, -37, -35, -34, -32, -31, -28, -28, -25, -24, -22, -19, -16, -13, -10, -7, -4, -1, 2, 5, 9, 12, 16, 19, 23, 26, 29, 33, 36, 38, 42, 45, 47, 49, 51, 51, 51, 51, 52, 52, 52, 52, 49, 49, 49, 48, 47, 46, 46, 47, 47, 51, 52, 48, 46, 51, 49, 52, 52, 50, 47, 47, 48, 51, 50, 47, 46, 45, 44, 45, 45, 43, 43, 43, 43, 43, 42, 42, 42, 40, 38, 41, 31, 29, 28, 27, 23, 21, 25, 31, 36, 38, 37, 34, 30, 28, 29, 29, 33, 33, 32, 29, 30, 30, 27, 25, 23, 22, 19, 18, 19, 20, 17, 16, 12, 8, 5, -3, -7, -9, -10, -10, -10, -11, -14, -17, -23, -28, -31, -33, -35, -37, -38, -41, -44, -45, -39, -33, -30, -29, -29, -31, -28, -28, -34, -42, -48, -51, -51, -51, -46, -42, -39, -42, -42, -44, -46, -46, -50, -56, -58, -57, -55, -54, -50, -47, -46, -44, -43, -43, -44, -42, -40, -37, -34, -31, -30, -25, -21, -16, -16, -16, -12, -8, -3, 0, 4, 7, 10, 13, 16, 19, 21, 23, 26, 29, 27, 28, 29, 31, 32, 33, 35, 37, 40, 42, 43, 39, 28, 16, 18, 22, 22, 20, 18, 16, 14, 11, 10, 8, 6, 4, 2, 1, 1, -0, -2, -4, -5, -6, -7, -8, -9, -9, -10, -11, -13, -12, -13, -13, -12, -11, -11, -11, -11, -12, -12, - /* 38.0 */ -13, -12, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -14, -14, -15, -15, -16, -17, -17, -18, -19, -20, -21, -22, -22, -24, -25, -26, -27, -29, -30, -31, -33, -33, -35, -35, -36, -36, -37, -37, -38, -38, -39, -39, -39, -39, -39, -38, -37, -37, -33, -32, -31, -26, -24, -25, -25, -25, -24, -23, -21, -19, -21, -20, -19, -17, -15, -16, -17, -21, -23, -25, -26, -27, -27, -29, -30, -32, -32, -33, -32, -32, -31, -30, -30, -31, -32, -34, -35, -34, -34, -33, -32, -32, -33, -34, -35, -37, -37, -39, -42, -42, -41, -41, -41, -41, -40, -38, -36, -34, -32, -30, -28, -28, -27, -24, -22, -20, -18, -15, -11, -8, -5, -2, 1, 4, 7, 9, 13, 16, 20, 23, 27, 31, 34, 37, 39, 42, 45, 48, 51, 53, 54, 55, 56, 55, 55, 55, 55, 53, 52, 51, 50, 49, 48, 49, 47, 48, 49, 50, 48, 45, 44, 49, 53, 55, 55, 55, 52, 51, 51, 52, 50, 49, 47, 46, 45, 44, 44, 43, 42, 42, 43, 44, 43, 43, 44, 42, 42, 38, 31, 29, 25, 23, 25, 29, 36, 39, 39, 39, 38, 36, 36, 37, 37, 37, 36, 35, 36, 35, 34, 31, 28, 26, 23, 23, 24, 24, 20, 18, 16, 13, 5, -8, -12, -12, -13, -16, -17, -16, -15, -19, -26, -29, -31, -33, -35, -36, -38, -38, -39, -43, -44, -41, -33, -30, -28, -28, -30, -33, -46, -52, -53, -54, -54, -55, -56, -56, -56, -55, -49, -45, -44, -48, -54, -59, -60, -58, -53, -48, -47, -47, -45, -44, -45, -46, -49, -47, -45, -42, -39, -36, -32, -30, -25, -20, -17, -16, -15, -13, -9, -5, -1, 3, 7, 10, 13, 15, 18, 20, 23, 26, 26, 26, 27, 28, 29, 31, 31, 32, 36, 36, 38, 42, 41, 35, 24, 17, 21, 22, 21, 19, 16, 13, 12, 10, 8, 6, 4, 3, 1, -0, -2, -3, -4, -4, -5, -7, -9, -9, -10, -11, -12, -10, -8, -14, -13, -12, -11, -11, -11, -12, -13, -13, - /* 39.0 */ -13, -12, -13, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -12, -12, -12, -12, -13, -13, -13, -14, -14, -15, -15, -16, -17, -17, -18, -19, -21, -22, -22, -23, -24, -26, -27, -28, -30, -31, -32, -33, -34, -34, -35, -35, -36, -36, -37, -37, -37, -37, -37, -37, -37, -36, -36, -34, -30, -30, -27, -24, -25, -24, -22, -22, -21, -21, -20, -18, -18, -20, -18, -17, -14, -14, -16, -20, -22, -24, -25, -26, -27, -28, -30, -32, -33, -33, -33, -33, -33, -32, -32, -32, -33, -35, -35, -35, -34, -35, -34, -32, -33, -34, -33, -35, -36, -37, -37, -39, -40, -39, -38, -38, -38, -37, -36, -33, -32, -31, -27, -27, -25, -24, -22, -19, -16, -13, -10, -7, -3, -0, 2, 5, 8, 11, 14, 17, 20, 24, 27, 30, 33, 36, 39, 43, 45, 49, 52, 54, 56, 57, 58, 58, 58, 57, 56, 55, 54, 52, 51, 51, 49, 49, 49, 48, 49, 50, 51, 49, 49, 53, 54, 55, 55, 54, 54, 54, 53, 53, 52, 50, 49, 49, 47, 46, 45, 44, 44, 45, 46, 44, 43, 43, 43, 43, 43, 44, 37, 30, 29, 27, 28, 33, 38, 40, 40, 40, 40, 39, 40, 40, 39, 37, 37, 36, 36, 36, 34, 31, 30, 29, 28, 27, 26, 24, 21, 18, 14, 11, -0, -12, -17, -17, -18, -21, -20, -19, -21, -24, -27, -29, -31, -33, -34, -36, -37, -38, -36, -35, -36, -36, -35, -33, -30, -30, -36, -47, -51, -52, -51, -51, -54, -57, -59, -60, -62, -63, -63, -63, -58, -55, -55, -56, -56, -52, -51, -49, -47, -46, -48, -52, -52, -52, -51, -48, -45, -42, -39, -36, -32, -28, -25, -19, -16, -14, -13, -12, -9, -5, -1, 2, 6, 10, 13, 15, 17, 20, 23, 24, 23, 25, 25, 26, 28, 30, 31, 31, 33, 35, 37, 39, 41, 38, 25, 15, 20, 22, 21, 20, 18, 16, 13, 11, 9, 7, 5, 4, 2, 0, -1, -3, -4, -5, -6, -7, -9, -9, -10, -11, -13, -15, -13, -14, -13, -12, -12, -12, -12, -13, -13, -13, - /* 40.0 */ -13, -13, -12, -13, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -13, -13, -13, -13, -14, -15, -16, -16, -17, -18, -20, -21, -22, -22, -24, -25, -26, -28, -28, -30, -30, -31, -32, -33, -34, -34, -35, -35, -36, -36, -36, -37, -37, -36, -36, -35, -34, -31, -28, -28, -23, -23, -23, -23, -21, -20, -19, -19, -19, -18, -16, -18, -17, -16, -13, -12, -17, -19, -21, -23, -24, -25, -26, -27, -28, -30, -32, -33, -33, -33, -33, -33, -33, -33, -34, -35, -34, -34, -34, -35, -35, -34, -33, -35, -35, -35, -34, -34, -35, -35, -35, -35, -34, -34, -34, -34, -34, -33, -31, -30, -29, -27, -25, -23, -21, -18, -15, -12, -9, -6, -2, 1, 4, 7, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, 43, 46, 49, 52, 55, 57, 59, 59, 59, 60, 59, 58, 57, 56, 54, 54, 52, 51, 52, 51, 49, 48, 47, 46, 46, 46, 49, 54, 56, 55, 55, 54, 52, 52, 53, 52, 51, 50, 48, 49, 48, 45, 45, 44, 46, 48, 46, 44, 44, 44, 45, 46, 45, 38, 39, 34, 34, 36, 40, 40, 41, 40, 40, 40, 39, 38, 39, 39, 38, 37, 35, 34, 32, 30, 29, 30, 29, 29, 27, 26, 22, 20, 19, 11, 3, -8, -16, -21, -18, -15, -16, -15, -18, -21, -24, -26, -28, -30, -33, -34, -35, -36, -37, -38, -39, -41, -41, -42, -40, -39, -35, -35, -41, -45, -46, -50, -56, -60, -62, -62, -64, -66, -67, -67, -66, -66, -67, -66, -64, -63, -62, -59, -56, -55, -57, -57, -55, -54, -53, -50, -47, -45, -43, -40, -36, -32, -29, -25, -20, -16, -13, -11, -10, -8, -4, -1, 3, 5, 8, 11, 14, 17, 20, 24, 24, 23, 23, 24, 25, 26, 29, 30, 31, 31, 33, 34, 38, 40, 37, 24, 15, 17, 21, 21, 20, 18, 17, 15, 12, 10, 8, 6, 5, 3, 1, -0, -2, -3, -4, -6, -7, -8, -9, -10, -11, -13, -11, -15, -13, -12, -11, -12, -12, -13, -13, -12, -13, - /* 41.0 */ -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -12, -12, -12, -13, -14, -15, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -31, -32, -33, -33, -33, -33, -33, -32, -32, -32, -32, -32, -33, -30, -25, -25, -23, -22, -21, -20, -19, -18, -17, -17, -17, -17, -14, -13, -14, -16, -12, -11, -15, -18, -20, -21, -22, -23, -24, -26, -27, -28, -30, -32, -32, -33, -33, -33, -33, -33, -34, -35, -34, -36, -35, -34, -34, -35, -33, -34, -34, -33, -34, -32, -31, -32, -32, -31, -31, -29, -28, -30, -31, -30, -29, -28, -27, -26, -24, -21, -19, -16, -13, -10, -7, -4, -1, 3, 7, 9, 12, 16, 19, 21, 24, 27, 30, 34, 37, 40, 42, 45, 47, 50, 53, 55, 58, 59, 61, 61, 60, 60, 59, 58, 57, 56, 56, 54, 52, 52, 51, 51, 50, 49, 48, 48, 48, 49, 55, 56, 56, 56, 55, 54, 54, 53, 51, 50, 50, 49, 48, 46, 46, 45, 45, 46, 48, 47, 46, 46, 47, 48, 48, 48, 46, 40, 35, 37, 43, 44, 43, 42, 41, 41, 39, 38, 37, 36, 36, 36, 35, 34, 31, 28, 26, 25, 24, 24, 24, 25, 26, 23, 18, 11, 5, 5, -6, -16, -16, -11, -12, -13, -14, -17, -21, -25, -27, -28, -30, -32, -33, -34, -36, -37, -40, -42, -44, -41, -45, -49, -44, -38, -34, -34, -33, -35, -44, -54, -59, -61, -63, -65, -66, -65, -64, -62, -62, -62, -64, -63, -61, -61, -60, -58, -56, -56, -56, -56, -55, -53, -50, -48, -46, -42, -40, -38, -33, -28, -24, -21, -17, -14, -11, -8, -7, -3, 1, 3, 5, 7, 10, 14, 18, 21, 24, 26, 27, 24, 23, 24, 25, 26, 27, 28, 30, 30, 32, 35, 36, 29, 17, 11, 10, 16, 19, 19, 18, 17, 16, 14, 12, 10, 7, 6, 4, 2, 1, -1, -3, -4, -5, -6, -7, -8, -9, -11, -12, -7, -8, -13, -11, -11, -12, -12, -12, -12, -12, -12, - /* 42.0 */ -11, -11, -11, -11, -11, -10, -10, -9, -9, -9, -9, -9, -9, -8, -8, -9, -9, -10, -10, -10, -10, -11, -11, -12, -13, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -30, -31, -31, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30, -27, -24, -23, -21, -20, -19, -18, -17, -16, -15, -15, -15, -15, -14, -14, -14, -14, -13, -12, -14, -18, -19, -19, -21, -22, -24, -25, -25, -28, -29, -28, -32, -32, -33, -33, -34, -34, -34, -34, -34, -35, -36, -36, -35, -35, -33, -32, -33, -33, -31, -32, -30, -30, -29, -28, -28, -27, -26, -25, -27, -26, -26, -26, -26, -24, -23, -20, -17, -13, -10, -8, -6, -1, 4, 5, 9, 12, 15, 18, 21, 24, 26, 29, 32, 35, 38, 42, 44, 46, 48, 51, 53, 56, 58, 60, 62, 61, 61, 61, 60, 60, 59, 58, 57, 57, 55, 54, 54, 53, 51, 51, 50, 51, 52, 53, 56, 56, 57, 57, 54, 54, 54, 52, 50, 50, 50, 51, 50, 47, 47, 46, 46, 46, 51, 47, 48, 48, 49, 48, 46, 47, 44, 39, 37, 41, 45, 44, 45, 43, 41, 40, 40, 38, 34, 30, 28, 27, 28, 29, 27, 25, 22, 20, 19, 19, 18, 20, 20, 19, 14, 12, 9, -1, -8, -11, -12, -11, -12, -14, -17, -20, -23, -25, -27, -28, -29, -31, -33, -34, -35, -39, -41, -43, -43, -40, -36, -38, -37, -36, -35, -37, -38, -38, -38, -39, -44, -52, -56, -56, -57, -60, -63, -62, -64, -63, -62, -63, -63, -63, -61, -58, -56, -56, -56, -55, -54, -53, -50, -48, -46, -43, -40, -36, -33, -29, -26, -23, -19, -16, -11, -7, -5, -2, 0, 2, 4, 6, 8, 13, 18, 21, 23, 25, 26, 25, 23, 23, 24, 25, 26, 27, 28, 29, 30, 35, 33, 22, 21, 15, 11, 9, 10, 14, 16, 17, 16, 15, 13, 11, 9, 7, 5, 3, 2, -0, -1, -3, -4, -5, -6, -7, -8, -9, -12, -10, -11, -13, -11, -11, -11, -12, -12, -11, -11, -11, - /* 43.0 */ -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, -9, -9, -10, -11, -11, -12, -12, -13, -14, -16, -17, -18, -19, -20, -21, -22, -22, -23, -24, -25, -26, -27, -28, -29, -30, -30, -30, -30, -31, -30, -30, -30, -29, -29, -29, -29, -24, -23, -21, -20, -19, -18, -18, -16, -16, -15, -14, -13, -12, -11, -10, -10, -14, -12, -14, -15, -15, -18, -19, -21, -24, -26, -27, -26, -27, -29, -29, -30, -31, -32, -34, -35, -35, -35, -34, -34, -34, -35, -36, -36, -37, -36, -35, -35, -34, -32, -32, -29, -28, -27, -27, -27, -26, -24, -25, -23, -22, -22, -21, -21, -20, -20, -18, -14, -10, -8, -7, -2, 4, 10, 13, 16, 17, 19, 20, 23, 26, 29, 31, 34, 37, 40, 43, 45, 47, 50, 52, 54, 56, 59, 61, 62, 62, 62, 62, 62, 62, 62, 61, 60, 58, 58, 58, 57, 56, 53, 51, 52, 55, 53, 54, 55, 57, 56, 56, 55, 54, 51, 50, 51, 52, 52, 51, 50, 50, 49, 48, 46, 46, 47, 49, 49, 48, 47, 43, 43, 43, 43, 43, 44, 46, 45, 44, 44, 42, 41, 40, 38, 36, 31, 29, 28, 26, 23, 21, 20, 19, 20, 18, 15, 17, 22, 23, 22, 17, 12, 5, -1, -6, -8, -9, -10, -12, -14, -17, -19, -20, -23, -25, -27, -28, -29, -32, -32, -34, -37, -39, -41, -42, -42, -40, -41, -41, -42, -44, -43, -42, -41, -42, -44, -47, -46, -48, -49, -51, -48, -49, -53, -62, -65, -63, -64, -64, -62, -57, -57, -60, -57, -56, -55, -53, -52, -50, -49, -46, -44, -43, -40, -38, -34, -31, -28, -25, -22, -18, -13, -8, -4, -2, -1, 1, 3, 5, 8, 11, 15, 19, 21, 22, 24, 25, 25, 26, 26, 27, 26, 26, 27, 28, 29, 32, 33, 30, 31, 28, 28, 21, 11, 3, 6, 12, 15, 14, 14, 12, 11, 9, 7, 5, 3, 1, 0, -2, -3, -5, -5, -6, -7, -8, -11, -8, -10, -11, -9, -10, -11, -11, -10, -10, -10, -10, - /* 44.0 */ -8, -8, -8, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -6, -6, -6, -7, -7, -8, -9, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -28, -29, -29, -29, -29, -29, -29, -28, -28, -28, -29, -28, -23, -22, -21, -19, -18, -18, -17, -17, -15, -13, -11, -11, -11, -9, -8, -10, -13, -10, -15, -15, -13, -17, -20, -23, -25, -25, -26, -26, -27, -28, -29, -29, -31, -33, -36, -37, -36, -36, -34, -34, -36, -35, -36, -36, -37, -37, -37, -36, -34, -31, -29, -29, -28, -27, -27, -26, -24, -24, -23, -23, -23, -21, -19, -18, -15, -13, -12, -11, -9, -7, -3, 3, 8, 12, 16, 17, 18, 20, 23, 25, 28, 30, 33, 35, 38, 40, 44, 46, 48, 51, 53, 55, 57, 59, 61, 63, 64, 64, 64, 64, 63, 63, 63, 61, 60, 58, 58, 58, 56, 55, 55, 53, 50, 47, 47, 51, 51, 49, 48, 50, 46, 47, 49, 49, 49, 49, 51, 52, 51, 50, 51, 52, 49, 46, 46, 45, 42, 41, 42, 43, 44, 46, 47, 46, 45, 44, 43, 40, 40, 39, 37, 36, 35, 33, 32, 29, 25, 22, 20, 17, 17, 15, 13, 16, 21, 20, 18, 14, 7, 2, -2, -5, -7, -9, -11, -12, -13, -15, -16, -18, -20, -23, -25, -27, -29, -30, -32, -34, -36, -37, -38, -39, -38, -39, -41, -42, -44, -44, -45, -45, -46, -47, -47, -49, -49, -51, -51, -52, -52, -56, -61, -66, -64, -60, -61, -60, -58, -59, -60, -62, -58, -56, -54, -53, -52, -51, -49, -47, -46, -44, -42, -40, -37, -35, -32, -28, -25, -22, -18, -14, -10, -6, -4, -2, 0, 2, 4, 7, 9, 13, 16, 19, 20, 22, 25, 25, 24, 25, 25, 27, 27, 26, 27, 28, 30, 31, 31, 32, 31, 31, 31, 30, 19, 2, -3, 2, 9, 11, 12, 11, 10, 8, 6, 4, 3, 2, -0, -1, -3, -4, -5, -5, -8, -11, -8, -11, -10, -9, -9, -10, -9, -9, -9, -8, -8, - /* 45.0 */ -6, -6, -6, -6, -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -4, -4, -5, -6, -7, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -24, -25, -26, -26, -27, -27, -28, -28, -28, -27, -26, -27, -26, -27, -27, -27, -23, -22, -20, -20, -19, -17, -16, -15, -15, -14, -13, -11, -9, -9, -7, -12, -11, -14, -15, -15, -15, -17, -20, -22, -23, -24, -25, -25, -27, -27, -28, -28, -31, -31, -34, -36, -37, -37, -36, -35, -36, -37, -37, -37, -37, -36, -35, -34, -34, -32, -30, -30, -28, -27, -26, -26, -25, -24, -23, -22, -21, -20, -18, -17, -15, -13, -10, -7, -4, -2, 3, 6, 10, 14, 17, 19, 21, 23, 26, 28, 30, 32, 34, 37, 39, 42, 44, 46, 49, 51, 53, 55, 57, 60, 61, 63, 65, 65, 65, 65, 64, 64, 63, 62, 61, 59, 59, 59, 59, 57, 55, 56, 54, 53, 51, 48, 46, 46, 45, 45, 44, 47, 48, 47, 47, 49, 51, 53, 53, 51, 52, 53, 45, 42, 39, 41, 43, 43, 44, 46, 46, 46, 46, 45, 44, 43, 43, 42, 38, 37, 34, 32, 33, 32, 31, 29, 27, 26, 26, 22, 18, 16, 14, 13, 13, 13, 11, 8, 4, 1, -2, -4, -6, -9, -11, -12, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -32, -33, -35, -37, -38, -38, -39, -41, -42, -43, -44, -44, -45, -47, -48, -50, -49, -45, -40, -44, -52, -56, -58, -63, -66, -67, -65, -61, -59, -57, -57, -57, -56, -53, -53, -51, -49, -49, -49, -49, -47, -47, -46, -44, -42, -40, -37, -34, -32, -29, -26, -22, -18, -15, -12, -8, -5, -2, 0, 2, 4, 6, 8, 11, 14, 16, 18, 20, 23, 24, 23, 24, 25, 29, 30, 26, 26, 27, 28, 29, 28, 28, 27, 26, 26, 26, 28, 24, 14, 1, -4, 3, 10, 12, 11, 10, 8, 6, 5, 3, 2, -0, -2, -3, -4, -5, -7, -10, -3, -10, -9, -8, -9, -7, -8, -7, -7, -7, -6, - /* 46.0 */ -5, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, -0, -1, -1, -0, -0, -1, -1, -2, -3, -4, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -20, -21, -22, -23, -24, -25, -25, -26, -26, -26, -26, -25, -25, -25, -25, -25, -26, -26, -23, -20, -20, -20, -20, -21, -18, -16, -16, -15, -13, -12, -12, -11, -11, -13, -14, -15, -16, -16, -16, -16, -19, -21, -22, -24, -25, -26, -27, -27, -27, -28, -28, -30, -31, -32, -34, -35, -36, -36, -37, -38, -38, -38, -37, -37, -36, -35, -34, -33, -33, -32, -29, -28, -26, -25, -25, -24, -22, -20, -19, -18, -17, -15, -13, -12, -9, -6, -2, 1, 4, 7, 10, 14, 18, 20, 24, 26, 29, 29, 31, 33, 35, 38, 40, 42, 45, 47, 49, 52, 53, 55, 57, 60, 61, 63, 65, 66, 66, 66, 65, 64, 63, 61, 61, 61, 60, 59, 59, 57, 55, 54, 52, 50, 49, 48, 47, 47, 47, 46, 48, 49, 48, 48, 48, 49, 50, 50, 50, 49, 49, 51, 52, 48, 49, 49, 48, 45, 47, 47, 46, 45, 45, 45, 44, 43, 42, 42, 41, 39, 37, 32, 31, 31, 29, 27, 25, 23, 22, 20, 17, 15, 13, 12, 11, 9, 7, 6, 3, 1, -1, -4, -6, -8, -10, -12, -15, -16, -18, -20, -22, -24, -26, -27, -29, -30, -31, -33, -35, -36, -37, -38, -39, -41, -41, -42, -43, -44, -44, -46, -48, -50, -51, -51, -51, -50, -52, -51, -51, -56, -60, -61, -60, -58, -54, -53, -51, -50, -49, -52, -50, -49, -49, -49, -48, -46, -45, -45, -44, -42, -41, -39, -36, -34, -32, -28, -25, -22, -19, -16, -13, -11, -7, -3, 0, 2, 4, 5, 7, 10, 12, 14, 17, 19, 20, 21, 22, 22, 24, 27, 29, 29, 26, 25, 26, 26, 26, 26, 24, 23, 23, 23, 23, 24, 25, 24, 17, 7, 4, 10, 12, 12, 10, 9, 7, 5, 3, 1, -1, -2, -3, -4, -7, -4, -5, -9, -7, -6, -6, -6, -6, -6, -5, -5, -5, - /* 47.0 */ -3, -3, -2, -1, -1, -1, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, -0, -1, -2, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -13, -14, -15, -16, -18, -19, -20, -21, -22, -22, -23, -24, -24, -24, -24, -23, -23, -23, -24, -24, -25, -24, -23, -21, -20, -18, -20, -20, -19, -17, -16, -15, -14, -13, -13, -12, -12, -12, -14, -15, -16, -16, -16, -17, -19, -21, -22, -24, -25, -26, -27, -28, -29, -30, -29, -31, -32, -33, -35, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -36, -35, -34, -33, -31, -29, -28, -28, -26, -24, -22, -21, -20, -19, -18, -17, -15, -14, -11, -8, -4, -0, 3, 6, 8, 11, 15, 17, 21, 25, 28, 32, 35, 36, 35, 36, 38, 41, 44, 46, 48, 50, 52, 54, 56, 57, 60, 62, 63, 65, 66, 66, 66, 65, 64, 62, 62, 62, 61, 60, 59, 58, 57, 56, 55, 53, 50, 50, 50, 49, 48, 48, 50, 50, 49, 49, 48, 48, 48, 48, 48, 48, 48, 50, 49, 48, 48, 49, 50, 50, 49, 48, 48, 47, 45, 45, 44, 43, 42, 42, 41, 39, 39, 36, 33, 33, 31, 29, 28, 25, 24, 22, 21, 20, 18, 15, 14, 11, 9, 7, 5, 2, -1, -4, -6, -8, -11, -14, -15, -16, -18, -19, -20, -21, -22, -23, -25, -27, -29, -30, -32, -34, -35, -35, -36, -37, -39, -39, -41, -42, -43, -44, -45, -46, -47, -47, -48, -49, -49, -49, -48, -47, -47, -48, -53, -54, -51, -47, -43, -45, -47, -49, -49, -48, -47, -46, -45, -44, -43, -44, -44, -43, -42, -40, -38, -35, -33, -31, -28, -26, -23, -20, -17, -15, -12, -8, -4, -1, 2, 4, 5, 7, 9, 12, 13, 16, 18, 19, 20, 20, 21, 23, 25, 26, 28, 27, 25, 24, 24, 25, 25, 22, 21, 20, 21, 21, 21, 22, 23, 25, 24, 16, 4, 10, 12, 12, 10, 9, 7, 5, 3, 1, 0, -1, -3, -7, -3, -4, -6, -5, -4, -5, -5, -4, -4, -4, -3, -3, - /* 48.0 */ -1, -0, -0, 1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 1, 1, -0, -1, -2, -3, -4, -4, -5, -7, -8, -9, -10, -11, -12, -14, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -22, -22, -22, -22, -22, -23, -23, -23, -20, -20, -22, -18, -18, -18, -17, -17, -16, -15, -15, -13, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -18, -21, -22, -24, -25, -27, -27, -28, -29, -31, -32, -31, -33, -35, -35, -36, -37, -37, -37, -37, -38, -38, -38, -38, -38, -36, -35, -33, -33, -32, -30, -28, -28, -27, -24, -22, -21, -20, -19, -18, -17, -16, -14, -9, -4, -2, 2, 5, 8, 9, 13, 17, 21, 25, 27, 29, 32, 35, 36, 36, 37, 40, 42, 44, 46, 49, 51, 52, 54, 56, 58, 60, 62, 63, 65, 66, 65, 65, 64, 63, 63, 63, 62, 62, 61, 60, 58, 57, 56, 55, 54, 53, 52, 52, 53, 54, 52, 51, 51, 50, 49, 48, 47, 46, 46, 46, 46, 47, 48, 49, 49, 48, 47, 46, 45, 45, 45, 46, 46, 44, 44, 44, 43, 41, 40, 39, 38, 36, 34, 34, 33, 31, 30, 28, 25, 24, 22, 21, 20, 18, 16, 14, 12, 9, 7, 4, 1, -3, -5, -9, -12, -13, -14, -16, -17, -18, -19, -20, -22, -21, -20, -22, -24, -27, -29, -31, -33, -33, -33, -34, -35, -36, -38, -40, -41, -41, -42, -43, -43, -43, -43, -43, -45, -46, -47, -50, -51, -51, -51, -49, -46, -43, -42, -44, -48, -49, -49, -48, -47, -46, -44, -44, -44, -44, -44, -43, -43, -41, -40, -37, -34, -32, -30, -28, -26, -23, -21, -18, -16, -13, -9, -6, -2, 2, 3, 5, 7, 9, 11, 14, 16, 17, 18, 19, 19, 20, 21, 22, 23, 25, 26, 26, 24, 22, 24, 23, 22, 22, 20, 20, 20, 20, 20, 21, 21, 24, 25, 15, 2, 7, 10, 10, 9, 8, 6, 5, 3, 2, 1, -2, -4, -0, -6, -3, -2, -3, -2, -2, -2, -2, -2, -2, -1, - /* 49.0 */ 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 5, 5, 5, 4, 3, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -11, -12, -13, -14, -16, -17, -18, -18, -19, -19, -20, -20, -20, -21, -21, -22, -21, -20, -17, -17, -21, -19, -17, -16, -16, -16, -16, -15, -15, -15, -14, -15, -15, -16, -16, -17, -17, -17, -18, -19, -19, -20, -21, -22, -23, -25, -27, -28, -29, -31, -32, -33, -34, -35, -36, -37, -38, -38, -39, -39, -38, -38, -39, -39, -39, -39, -38, -37, -36, -35, -34, -33, -30, -27, -27, -26, -24, -20, -19, -20, -20, -18, -16, -14, -10, -3, 2, 5, 7, 9, 12, 15, 22, 24, 22, 23, 26, 29, 33, 35, 37, 39, 41, 43, 45, 47, 50, 52, 53, 55, 56, 58, 60, 62, 64, 65, 65, 64, 64, 64, 63, 63, 63, 62, 61, 60, 59, 58, 57, 56, 56, 58, 58, 58, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 45, 45, 47, 47, 48, 48, 48, 48, 47, 46, 47, 47, 46, 46, 43, 43, 43, 43, 41, 39, 37, 33, 32, 34, 34, 33, 31, 28, 26, 23, 23, 21, 19, 17, 15, 13, 10, 10, 9, 7, 5, 1, -3, -5, -7, -9, -12, -14, -15, -16, -16, -16, -19, -21, -22, -20, -19, -22, -24, -27, -29, -31, -31, -31, -32, -33, -34, -35, -37, -38, -39, -40, -40, -40, -40, -40, -42, -44, -45, -45, -46, -47, -44, -44, -42, -41, -42, -43, -44, -46, -47, -46, -46, -45, -45, -45, -44, -43, -43, -42, -42, -41, -40, -39, -37, -34, -32, -30, -28, -25, -23, -21, -19, -16, -13, -10, -7, -3, 0, 3, 5, 7, 9, 11, 13, 14, 16, 16, 18, 19, 20, 20, 21, 21, 23, 24, 24, 23, 21, 22, 22, 21, 21, 20, 20, 20, 20, 21, 21, 21, 22, 25, 25, 12, 1, 4, 8, 9, 9, 8, 7, 5, 4, 2, -1, 1, 1, -2, 0, 0, -0, -0, 0, -0, 0, 0, 0, 0, - /* 50.0 */ -6, -6, -5, -4, -2, -1, 1, 2, 3, 5, 5, 7, 7, 8, 8, 9, 9, 8, 8, 8, 7, 7, 7, 6, 5, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -5, -7, -8, -9, -10, -12, -13, -14, -15, -16, -17, -17, -17, -18, -18, -18, -20, -20, -16, -15, -17, -17, -17, -17, -16, -16, -16, -16, -16, -15, -14, -16, -17, -18, -17, -17, -17, -17, -19, -19, -19, -20, -20, -21, -23, -24, -25, -27, -28, -29, -30, -31, -33, -34, -35, -35, -36, -38, -39, -39, -40, -40, -39, -39, -39, -40, -40, -40, -39, -38, -36, -35, -33, -31, -29, -26, -25, -24, -24, -23, -23, -21, -19, -18, -16, -13, -10, -5, 1, 4, 8, 11, 13, 16, 22, 24, 23, 23, 26, 29, 32, 35, 38, 40, 42, 45, 47, 49, 51, 53, 54, 56, 57, 59, 61, 62, 63, 64, 64, 64, 63, 63, 63, 63, 63, 62, 61, 60, 58, 58, 57, 56, 57, 57, 59, 58, 58, 56, 55, 54, 53, 52, 50, 48, 46, 45, 45, 45, 45, 46, 47, 48, 49, 48, 48, 48, 47, 47, 47, 46, 45, 44, 44, 43, 42, 40, 37, 35, 33, 31, 32, 32, 32, 31, 29, 27, 25, 23, 21, 19, 16, 14, 12, 11, 11, 11, 10, 8, 5, 3, 0, -5, -7, -8, -10, -12, -14, -15, -15, -16, -17, -20, -21, -18, -17, -19, -22, -24, -26, -28, -29, -29, -30, -31, -32, -33, -34, -35, -35, -36, -38, -39, -40, -42, -44, -45, -45, -45, -44, -43, -43, -41, -41, -40, -41, -42, -42, -45, -46, -46, -46, -45, -43, -43, -42, -42, -41, -41, -40, -40, -40, -39, -37, -34, -32, -30, -27, -25, -23, -21, -19, -16, -14, -11, -8, -5, -1, 3, 5, 7, 9, 11, 12, 12, 13, 15, 17, 19, 20, 21, 21, 20, 21, 22, 23, 22, 21, 21, 22, 21, 19, 19, 19, 19, 20, 20, 21, 21, 22, 22, 24, 24, 16, 5, 2, 6, 8, 8, 8, 7, 5, 4, 3, 4, 1, 3, 2, 2, 1, 1, 1, 1, -1, -3, -5, -6, - /* 51.0 */ -8, -6, -7, -8, -10, -11, -11, -10, -7, -5, -2, 2, 5, 8, 9, 10, 10, 10, 10, 10, 10, 10, 9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 1, -0, -1, -3, -3, -5, -6, -8, -9, -10, -11, -13, -14, -14, -15, -15, -16, -17, -17, -16, -15, -15, -15, -15, -14, -14, -15, -15, -16, -16, -16, -16, -14, -13, -17, -18, -19, -19, -19, -20, -20, -21, -21, -21, -21, -22, -23, -25, -27, -28, -30, -31, -31, -32, -33, -34, -35, -36, -37, -38, -39, -40, -40, -40, -41, -42, -41, -41, -42, -42, -41, -39, -37, -36, -34, -33, -32, -29, -26, -24, -22, -21, -20, -19, -18, -17, -15, -13, -10, -8, -5, -2, 3, 9, 11, 14, 16, 20, 24, 24, 25, 27, 31, 34, 36, 39, 41, 43, 45, 48, 50, 52, 53, 55, 57, 58, 59, 61, 62, 63, 63, 63, 63, 63, 63, 63, 63, 62, 62, 60, 59, 58, 57, 59, 60, 58, 59, 60, 59, 58, 56, 55, 54, 54, 53, 51, 48, 46, 45, 45, 44, 45, 45, 45, 46, 47, 48, 48, 47, 46, 46, 44, 44, 43, 42, 41, 39, 38, 37, 36, 34, 31, 30, 30, 30, 30, 28, 25, 25, 25, 23, 20, 18, 16, 14, 13, 12, 11, 10, 9, 7, 6, 5, 3, -1, -4, -6, -8, -10, -11, -13, -14, -15, -17, -18, -18, -16, -16, -18, -20, -23, -24, -26, -27, -27, -28, -29, -30, -31, -32, -33, -35, -36, -38, -39, -40, -41, -42, -43, -43, -42, -42, -41, -41, -41, -40, -40, -40, -41, -42, -43, -43, -43, -43, -43, -43, -42, -40, -40, -39, -38, -38, -38, -38, -39, -37, -34, -32, -29, -27, -25, -23, -21, -19, -16, -14, -11, -8, -5, -2, 2, 4, 6, 8, 9, 10, 11, 12, 14, 16, 17, 18, 20, 20, 20, 19, 20, 21, 21, 20, 19, 20, 18, 17, 17, 18, 18, 18, 19, 19, 20, 22, 23, 23, 25, 25, 20, 6, 1, 5, 7, 8, 8, 8, 6, 6, 6, 5, 4, 3, 1, -1, -4, -5, -9, -10, -8, -5, -8, - /* 52.0 */ 4, 2, 4, 5, 7, 8, 7, 6, 6, 3, 2, -2, -3, -0, 2, 6, 8, 10, 11, 11, 11, 11, 11, 10, 10, 9, 9, 8, 7, 7, 6, 5, 4, 2, 1, 0, -1, -2, -4, -5, -7, -8, -9, -10, -11, -12, -12, -13, -14, -13, -14, -14, -14, -14, -13, -12, -13, -14, -14, -14, -15, -15, -15, -13, -12, -15, -18, -19, -20, -20, -20, -20, -21, -22, -22, -22, -23, -24, -24, -27, -30, -31, -32, -33, -33, -33, -34, -35, -36, -37, -39, -41, -42, -43, -43, -42, -43, -43, -43, -43, -44, -43, -42, -40, -39, -36, -34, -33, -31, -30, -28, -26, -23, -20, -18, -17, -16, -15, -13, -10, -8, -5, -1, 2, 4, 9, 12, 15, 17, 21, 22, 24, 26, 29, 32, 34, 36, 39, 42, 45, 47, 49, 50, 52, 54, 56, 57, 58, 60, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 61, 61, 59, 58, 57, 58, 61, 61, 60, 60, 59, 58, 58, 56, 56, 55, 54, 54, 52, 49, 48, 46, 45, 45, 44, 44, 43, 44, 44, 45, 45, 44, 44, 43, 42, 41, 40, 39, 37, 35, 33, 33, 32, 30, 29, 28, 28, 27, 26, 24, 21, 22, 23, 21, 20, 18, 16, 14, 13, 12, 11, 10, 8, 7, 7, 6, 4, 2, -0, -1, -3, -4, -6, -7, -8, -9, -12, -14, -14, -13, -13, -16, -18, -21, -23, -25, -25, -25, -26, -27, -28, -29, -30, -31, -33, -34, -36, -37, -39, -40, -41, -41, -41, -42, -43, -44, -43, -43, -42, -41, -39, -39, -40, -41, -42, -43, -41, -40, -40, -39, -38, -37, -37, -38, -38, -39, -40, -39, -36, -34, -32, -30, -27, -25, -23, -21, -19, -16, -14, -12, -9, -7, -4, -0, 2, 4, 6, 7, 8, 9, 11, 12, 14, 16, 18, 19, 19, 18, 18, 19, 20, 20, 19, 19, 18, 18, 16, 16, 17, 18, 19, 19, 20, 20, 21, 22, 23, 24, 24, 24, 12, 2, -1, 3, 7, 8, 9, 9, 8, 6, 3, 1, -3, -6, -2, 1, 5, 6, 4, 6, 6, 4, - /* 53.0 */ 5, 2, 2, 2, 3, 3, 5, 6, 8, 10, 13, 14, 14, 10, 4, 0, 0, 2, 4, 7, 9, 10, 11, 11, 12, 11, 11, 10, 9, 8, 7, 6, 6, 5, 3, 2, 1, -0, -2, -3, -5, -6, -7, -8, -9, -9, -11, -12, -9, -11, -12, -12, -13, -12, -11, -12, -12, -13, -13, -14, -14, -15, -14, -15, -16, -18, -20, -21, -22, -22, -22, -22, -22, -23, -24, -24, -25, -26, -27, -28, -30, -32, -33, -34, -34, -35, -36, -38, -39, -40, -41, -42, -43, -44, -45, -45, -45, -45, -45, -45, -45, -44, -43, -41, -39, -37, -34, -32, -30, -29, -27, -25, -23, -22, -19, -18, -16, -15, -14, -10, -7, -3, -0, 4, 7, 10, 13, 15, 19, 21, 23, 25, 28, 31, 34, 36, 39, 41, 44, 45, 47, 50, 51, 54, 56, 58, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 61, 60, 60, 60, 60, 60, 60, 59, 59, 60, 61, 60, 61, 60, 59, 58, 57, 56, 56, 55, 55, 53, 51, 49, 46, 45, 44, 43, 42, 42, 42, 41, 41, 41, 41, 41, 40, 39, 37, 36, 34, 33, 31, 30, 31, 30, 29, 28, 28, 27, 26, 24, 22, 20, 19, 19, 18, 17, 17, 16, 14, 12, 11, 10, 9, 8, 8, 7, 5, 5, 4, 3, 1, 0, -1, -2, -3, -4, -6, -9, -11, -12, -11, -12, -15, -17, -19, -20, -23, -24, -24, -25, -26, -27, -28, -29, -30, -32, -33, -35, -37, -38, -39, -39, -40, -40, -40, -41, -41, -42, -41, -40, -39, -39, -40, -41, -41, -40, -40, -40, -39, -38, -37, -36, -36, -37, -38, -38, -37, -36, -35, -35, -34, -31, -29, -27, -25, -23, -20, -19, -17, -15, -12, -10, -8, -6, -4, -2, 0, 2, 5, 6, 8, 9, 11, 13, 15, 17, 18, 18, 17, 18, 18, 18, 19, 19, 18, 18, 17, 16, 16, 17, 18, 18, 18, 19, 20, 21, 21, 23, 23, 24, 24, 21, 17, 5, -3, 1, 8, 10, 9, 5, 1, -3, -0, 3, 5, 7, 5, 2, 2, 1, 1, 2, 5, - /* 54.0 */ 5, -0, 2, 3, 4, 4, 5, 6, 7, 8, 10, 11, 13, 15, 18, 18, 16, 13, 8, 7, 8, 8, 8, 8, 9, 10, 11, 11, 11, 10, 11, 10, 9, 7, 5, 4, 3, 1, 0, -1, -2, -3, -4, -5, -6, -8, -9, -6, -8, -9, -9, -10, -10, -10, -11, -12, -12, -13, -14, -14, -14, -15, -15, -16, -18, -19, -20, -22, -23, -23, -24, -25, -25, -26, -26, -26, -27, -29, -30, -30, -31, -32, -34, -36, -37, -38, -39, -39, -40, -42, -43, -44, -45, -46, -46, -46, -45, -45, -45, -44, -44, -43, -42, -41, -39, -37, -35, -32, -31, -29, -27, -24, -23, -21, -20, -18, -18, -16, -15, -13, -9, -5, -1, 2, 6, 11, 14, 16, 18, 21, 24, 27, 30, 32, 35, 38, 40, 42, 44, 47, 49, 51, 53, 55, 58, 59, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 60, 60, 60, 61, 61, 61, 60, 59, 58, 58, 58, 59, 59, 59, 58, 58, 57, 56, 55, 54, 53, 51, 48, 46, 44, 43, 41, 41, 41, 40, 40, 39, 39, 40, 39, 39, 37, 36, 35, 34, 32, 30, 29, 29, 29, 28, 28, 27, 26, 25, 24, 23, 21, 20, 18, 17, 17, 16, 16, 15, 13, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 3, 2, 0, 0, -1, -3, -5, -8, -10, -11, -10, -10, -12, -14, -17, -18, -20, -22, -23, -24, -26, -27, -27, -28, -30, -31, -33, -34, -36, -37, -38, -38, -39, -39, -39, -39, -40, -39, -39, -40, -38, -36, -37, -39, -40, -39, -39, -38, -37, -36, -36, -37, -39, -40, -39, -38, -36, -34, -34, -33, -32, -33, -31, -27, -24, -22, -21, -19, -17, -15, -13, -11, -9, -8, -6, -4, -2, 1, 4, 5, 7, 8, 10, 12, 13, 14, 16, 17, 16, 16, 17, 17, 18, 17, 16, 17, 17, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20, 22, 22, 24, 25, 24, 22, 14, 5, -1, 4, 6, 2, 0, 2, 4, 4, 3, 2, 2, 2, 3, 3, 2, 2, 4, 5, - /* 55.0 */ -1, 1, 2, 3, 4, 5, 5, 6, 6, 7, 9, 10, 12, 14, 14, 16, 17, 17, 17, 18, 17, 16, 14, 13, 12, 10, 9, 10, 12, 12, 11, 9, 8, 7, 7, 6, 5, 3, 2, 1, 0, -1, -2, -3, -5, -7, -4, -4, -5, -6, -7, -8, -8, -9, -9, -10, -11, -12, -12, -14, -15, -16, -17, -17, -18, -19, -20, -22, -23, -24, -25, -26, -27, -28, -28, -29, -29, -31, -31, -32, -33, -34, -35, -37, -39, -40, -41, -42, -42, -43, -45, -46, -46, -47, -47, -46, -45, -45, -45, -44, -44, -44, -43, -41, -39, -37, -35, -33, -31, -29, -26, -24, -23, -20, -17, -16, -15, -13, -12, -11, -8, -4, -1, 3, 8, 13, 15, 16, 18, 22, 25, 28, 31, 34, 37, 39, 41, 43, 45, 47, 50, 52, 54, 56, 58, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 60, 60, 60, 61, 62, 62, 60, 58, 58, 57, 56, 56, 56, 58, 58, 58, 57, 56, 55, 54, 53, 51, 48, 46, 44, 43, 42, 42, 41, 41, 40, 41, 40, 40, 39, 37, 36, 34, 34, 33, 31, 29, 28, 27, 26, 25, 25, 25, 24, 23, 22, 21, 20, 19, 19, 17, 17, 16, 16, 15, 15, 14, 12, 11, 10, 9, 7, 6, 6, 6, 5, 4, 3, 2, 1, -0, -2, -4, -6, -8, -10, -9, -9, -10, -12, -14, -17, -18, -20, -22, -23, -24, -25, -26, -27, -29, -30, -32, -33, -34, -35, -35, -36, -36, -36, -36, -37, -37, -37, -38, -37, -35, -36, -38, -38, -38, -38, -37, -38, -38, -38, -38, -40, -40, -40, -39, -37, -35, -34, -33, -32, -32, -32, -30, -26, -25, -23, -20, -18, -17, -15, -13, -11, -9, -8, -6, -4, -2, 0, 2, 4, 5, 7, 9, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 15, 16, 16, 16, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 24, 25, 23, 22, 20, 14, 1, -1, 1, 8, 14, 9, 7, 5, 2, 2, 2, -0, -2, 1, 4, 4, 2, -1, - /* 56.0 */ 2, 2, 3, 3, 3, 3, 3, 4, 5, 8, 10, 12, 13, 13, 14, 14, 15, 15, 15, 16, 17, 16, 14, 13, 12, 13, 14, 11, 7, 6, 7, 8, 9, 9, 8, 8, 6, 6, 5, 3, 2, 1, -1, -2, -4, -1, -0, -1, -2, -2, -3, -6, -7, -7, -8, -8, -10, -11, -13, -14, -15, -16, -17, -18, -19, -20, -21, -23, -24, -25, -27, -28, -29, -29, -29, -30, -31, -31, -32, -33, -34, -35, -37, -38, -40, -41, -42, -43, -44, -45, -46, -48, -47, -48, -48, -48, -47, -47, -46, -45, -44, -44, -43, -41, -39, -37, -35, -33, -31, -29, -27, -26, -25, -21, -17, -15, -13, -11, -10, -9, -6, -0, 5, 6, 8, 11, 14, 17, 20, 23, 26, 28, 31, 34, 37, 39, 41, 43, 45, 47, 49, 52, 54, 56, 58, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 63, 63, 61, 61, 61, 61, 62, 62, 60, 58, 57, 55, 56, 57, 58, 58, 57, 56, 55, 54, 52, 50, 48, 47, 45, 45, 44, 43, 42, 42, 41, 41, 40, 39, 38, 37, 36, 35, 33, 32, 30, 28, 26, 25, 25, 24, 23, 23, 22, 21, 21, 20, 19, 19, 17, 17, 17, 17, 16, 15, 15, 14, 13, 12, 10, 9, 8, 8, 7, 6, 6, 5, 4, 3, 1, -1, -2, -5, -6, -7, -7, -7, -8, -8, -10, -13, -16, -18, -19, -20, -22, -23, -24, -25, -27, -28, -30, -31, -31, -32, -34, -34, -35, -35, -35, -35, -36, -36, -36, -36, -36, -37, -38, -38, -38, -38, -39, -39, -39, -40, -41, -41, -41, -40, -39, -38, -37, -36, -34, -34, -33, -32, -29, -28, -27, -26, -24, -22, -20, -18, -15, -11, -10, -9, -8, -7, -4, -2, -0, 2, 4, 6, 8, 10, 11, 12, 13, 13, 14, 15, 15, 15, 15, 14, 14, 15, 15, 16, 17, 18, 18, 18, 19, 19, 19, 18, 18, 18, 20, 21, 22, 24, 23, 21, 19, 15, 11, 7, 8, 9, 8, 8, 7, 6, 4, 2, 3, 1, 1, -0, -0, -0, 1, 2, - /* 57.0 */ 2, 2, 2, 3, 3, 2, 5, 10, 11, 11, 12, 12, 12, 13, 13, 14, 15, 15, 15, 15, 14, 15, 16, 15, 12, 12, 13, 14, 15, 14, 11, 8, 7, 8, 8, 8, 7, 6, 5, 4, 3, 1, 0, -1, 1, 2, 1, 1, 1, 1, -2, -3, -4, -5, -6, -8, -8, -10, -12, -13, -14, -15, -17, -19, -20, -22, -22, -23, -25, -26, -28, -29, -29, -30, -30, -31, -32, -33, -34, -35, -36, -38, -39, -41, -42, -43, -45, -46, -47, -47, -48, -48, -49, -49, -48, -48, -48, -48, -47, -45, -44, -44, -42, -41, -39, -37, -35, -33, -31, -29, -28, -27, -23, -20, -16, -13, -11, -10, -9, -7, -1, 4, 6, 8, 11, 13, 16, 18, 21, 24, 27, 29, 32, 34, 37, 39, 42, 44, 46, 47, 49, 51, 53, 55, 57, 60, 61, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 62, 62, 61, 60, 60, 60, 60, 60, 60, 57, 55, 56, 56, 58, 58, 57, 56, 55, 54, 52, 50, 48, 47, 46, 46, 44, 43, 43, 42, 41, 40, 39, 38, 38, 37, 36, 34, 32, 30, 28, 27, 25, 23, 22, 22, 21, 20, 21, 21, 20, 19, 19, 18, 16, 16, 17, 16, 14, 13, 13, 13, 13, 12, 11, 9, 9, 8, 9, 8, 7, 6, 5, 4, 2, 0, -1, -3, -5, -5, -5, -6, -6, -7, -10, -12, -14, -16, -18, -19, -21, -22, -23, -25, -26, -28, -29, -29, -30, -31, -32, -33, -34, -34, -34, -35, -35, -36, -36, -36, -37, -38, -38, -38, -39, -39, -39, -39, -40, -41, -40, -40, -40, -39, -38, -37, -36, -35, -35, -34, -34, -33, -30, -27, -24, -24, -23, -21, -19, -17, -15, -13, -12, -10, -10, -8, -5, -4, -2, 1, 4, 6, 7, 9, 10, 11, 11, 12, 12, 14, 15, 15, 15, 14, 14, 14, 15, 15, 16, 17, 17, 18, 18, 18, 17, 17, 16, 17, 18, 19, 20, 21, 21, 20, 19, 18, 15, 11, 10, 10, 9, 8, 7, 6, 5, 3, 2, 2, 2, 1, 1, 1, 2, 2, - /* 58.0 */ 2, 1, 1, 2, 4, 4, 7, 9, 9, 10, 11, 11, 12, 12, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 15, 13, 13, 12, 13, 14, 13, 10, 6, 6, 7, 7, 7, 5, 4, 3, 3, 2, 3, 4, 3, 2, 3, 2, 1, -0, -1, -2, -4, -5, -6, -9, -12, -13, -15, -15, -17, -19, -20, -21, -23, -24, -24, -26, -28, -29, -30, -31, -32, -32, -33, -34, -35, -36, -37, -38, -40, -41, -43, -44, -45, -46, -47, -48, -48, -48, -49, -49, -48, -48, -48, -47, -47, -46, -45, -44, -42, -41, -38, -37, -35, -33, -32, -30, -28, -28, -26, -22, -19, -16, -12, -9, -8, -7, -3, 3, 5, 6, 9, 11, 14, 17, 19, 22, 25, 27, 30, 32, 35, 38, 40, 42, 43, 45, 47, 49, 51, 52, 54, 56, 58, 60, 62, 63, 63, 63, 63, 63, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 60, 60, 60, 60, 57, 56, 56, 56, 58, 57, 57, 56, 55, 53, 50, 49, 49, 48, 47, 46, 45, 44, 43, 42, 42, 41, 39, 38, 37, 36, 34, 33, 31, 29, 27, 25, 22, 21, 20, 20, 20, 19, 19, 20, 19, 18, 17, 16, 15, 16, 15, 15, 15, 14, 14, 14, 13, 12, 11, 11, 10, 9, 9, 9, 8, 7, 6, 5, 4, 2, 1, -1, -2, -3, -3, -4, -5, -5, -8, -11, -13, -15, -16, -18, -20, -21, -22, -24, -25, -26, -27, -28, -29, -30, -30, -32, -33, -33, -34, -34, -35, -36, -36, -35, -35, -36, -37, -37, -38, -38, -37, -36, -38, -39, -40, -40, -40, -39, -37, -36, -35, -34, -34, -34, -33, -33, -32, -29, -27, -24, -22, -20, -19, -17, -16, -16, -14, -13, -11, -9, -7, -5, -2, 1, 2, 4, 6, 7, 8, 10, 10, 10, 11, 11, 12, 14, 15, 14, 13, 13, 13, 13, 14, 15, 15, 16, 16, 17, 17, 16, 16, 17, 16, 17, 19, 19, 18, 18, 19, 17, 15, 13, 10, 10, 9, 7, 6, 7, 6, 3, 2, 2, 1, 1, 1, 1, 1, 2, - /* 59.0 */ 1, 1, 4, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 12, 11, 10, 11, 13, 12, 11, 8, 7, 6, 6, 7, 8, 7, 5, 7, 9, 6, 5, 5, 3, 2, 2, 0, -1, -3, -4, -5, -8, -11, -12, -13, -15, -17, -18, -19, -20, -20, -21, -24, -27, -29, -30, -31, -32, -33, -33, -34, -35, -35, -36, -38, -40, -41, -42, -43, -45, -46, -48, -49, -49, -49, -49, -48, -48, -48, -48, -48, -47, -46, -46, -45, -44, -44, -42, -39, -36, -34, -33, -31, -29, -28, -27, -26, -24, -21, -18, -15, -11, -7, -5, -1, 3, 5, 5, 7, 10, 13, 15, 18, 21, 23, 25, 28, 31, 34, 36, 38, 40, 43, 45, 46, 47, 49, 50, 52, 53, 55, 57, 59, 61, 62, 63, 64, 64, 63, 63, 63, 62, 62, 61, 61, 61, 60, 61, 61, 60, 59, 59, 58, 56, 56, 55, 56, 55, 55, 57, 56, 55, 54, 52, 51, 48, 47, 47, 46, 45, 44, 44, 44, 45, 44, 42, 40, 38, 35, 33, 31, 29, 28, 26, 24, 21, 19, 18, 19, 20, 20, 19, 18, 17, 17, 16, 15, 15, 15, 16, 17, 16, 15, 14, 14, 14, 13, 13, 13, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 2, 1, 0, -1, -2, -3, -3, -5, -9, -10, -12, -14, -15, -17, -18, -20, -21, -22, -24, -25, -27, -28, -28, -29, -30, -31, -31, -32, -33, -33, -34, -34, -34, -35, -34, -35, -36, -37, -36, -35, -34, -34, -34, -34, -35, -36, -36, -36, -36, -36, -34, -32, -32, -32, -31, -31, -30, -29, -28, -27, -25, -23, -20, -19, -19, -19, -18, -16, -14, -11, -8, -6, -5, -3, -1, 0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 15, 16, 17, 18, 17, 17, 16, 16, 16, 16, 16, 17, 17, 17, 16, 14, 14, 12, 10, 7, 6, 6, 7, 5, 1, 0, 0, 0, -0, 0, 0, 1, 1, - /* 60.0 */ 0, 3, 5, 5, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 12, 13, 13, 15, 15, 15, 15, 15, 15, 15, 14, 13, 9, 11, 13, 13, 13, 12, 12, 12, 11, 10, 11, 10, 11, 12, 11, 10, 8, 7, 5, 4, 3, 2, 0, -1, -3, -4, -5, -7, -10, -12, -12, -14, -16, -17, -18, -20, -22, -24, -26, -28, -29, -30, -31, -32, -33, -34, -35, -36, -37, -39, -40, -41, -42, -43, -44, -46, -47, -48, -49, -50, -49, -48, -47, -46, -47, -47, -47, -45, -44, -43, -43, -42, -42, -41, -38, -35, -32, -30, -28, -27, -25, -24, -23, -21, -19, -17, -13, -8, -5, -2, 1, 4, 5, 7, 9, 11, 14, 17, 19, 22, 24, 27, 29, 30, 33, 36, 39, 41, 44, 45, 48, 48, 49, 50, 51, 52, 54, 56, 58, 60, 61, 63, 64, 64, 64, 64, 64, 63, 63, 62, 61, 61, 61, 60, 60, 60, 60, 60, 60, 58, 58, 57, 55, 56, 56, 55, 55, 54, 54, 53, 51, 49, 48, 47, 47, 45, 45, 45, 44, 45, 45, 42, 40, 39, 36, 33, 31, 29, 27, 25, 23, 20, 19, 19, 19, 20, 19, 18, 16, 16, 15, 15, 16, 16, 16, 16, 16, 16, 14, 12, 11, 12, 11, 11, 11, 11, 11, 10, 8, 7, 7, 7, 6, 5, 4, 3, 2, 0, -1, -2, -3, -3, -4, -8, -10, -11, -13, -15, -16, -17, -18, -20, -21, -23, -24, -25, -26, -26, -28, -28, -29, -30, -31, -31, -32, -32, -32, -32, -32, -32, -33, -34, -34, -33, -32, -31, -31, -33, -35, -35, -34, -34, -34, -34, -33, -33, -32, -31, -31, -31, -29, -28, -28, -28, -28, -28, -27, -26, -23, -20, -19, -18, -17, -15, -12, -10, -8, -6, -4, -3, -2, -1, 1, 2, 4, 4, 5, 5, 6, 9, 10, 11, 12, 13, 12, 13, 14, 14, 14, 14, 14, 15, 16, 17, 17, 17, 17, 16, 15, 14, 14, 14, 14, 15, 14, 13, 13, 13, 12, 11, 9, 8, 9, 4, -1, -1, -1, -2, -2, -1, -0, 0, 0, - /* 61.0 */ 5, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 15, 15, 15, 11, 6, 8, 12, 14, 16, 17, 18, 18, 16, 15, 17, 16, 13, 12, 10, 8, 7, 6, 5, 4, 3, 1, -0, -1, -2, -3, -5, -8, -11, -12, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -31, -32, -32, -33, -34, -35, -37, -38, -39, -41, -42, -43, -44, -45, -46, -48, -48, -49, -49, -49, -48, -47, -46, -46, -46, -45, -44, -43, -42, -40, -38, -37, -37, -35, -33, -31, -29, -27, -25, -24, -23, -22, -21, -20, -18, -13, -8, -3, -0, 3, 6, 8, 9, 11, 13, 16, 19, 21, 23, 25, 27, 29, 31, 33, 36, 38, 42, 46, 46, 48, 49, 49, 50, 51, 52, 53, 55, 56, 58, 60, 62, 63, 64, 65, 65, 65, 64, 64, 63, 63, 62, 61, 61, 60, 60, 60, 60, 59, 60, 59, 59, 58, 58, 57, 57, 55, 53, 52, 51, 51, 51, 49, 48, 47, 46, 45, 46, 46, 46, 45, 43, 40, 38, 36, 34, 32, 31, 29, 26, 23, 21, 20, 19, 19, 19, 19, 18, 17, 15, 15, 16, 16, 16, 16, 15, 15, 14, 13, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 8, 7, 7, 6, 5, 3, 3, 1, -0, -2, -3, -4, -3, -3, -6, -9, -10, -11, -13, -15, -17, -18, -19, -20, -21, -23, -24, -24, -25, -26, -27, -27, -28, -29, -29, -29, -29, -29, -29, -29, -29, -30, -31, -30, -30, -30, -30, -31, -32, -33, -34, -34, -34, -33, -33, -32, -31, -31, -30, -30, -30, -29, -28, -27, -26, -26, -26, -26, -26, -24, -21, -19, -19, -17, -15, -13, -11, -10, -8, -7, -6, -5, -3, -1, 0, 2, 3, 3, 4, 5, 8, 9, 11, 11, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 16, 15, 14, 13, 13, 14, 14, 14, 12, 11, 12, 12, 12, 11, 10, 10, 10, 8, 5, 3, 1, -1, -2, -0, 4, 5, - /* 62.0 */ 5, 5, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 14, 16, 15, 12, 10, 11, 16, 18, 18, 17, 17, 18, 18, 17, 15, 13, 12, 11, 9, 8, 7, 6, 5, 4, 2, 2, 1, 0, -1, -2, -4, -7, -11, -13, -14, -15, -18, -20, -22, -24, -26, -28, -29, -29, -30, -31, -32, -34, -34, -35, -37, -38, -40, -42, -42, -43, -44, -45, -46, -47, -48, -48, -48, -48, -48, -47, -46, -45, -44, -44, -43, -42, -40, -39, -38, -36, -34, -33, -31, -29, -27, -25, -24, -24, -23, -21, -19, -16, -13, -9, -5, -1, 2, 6, 10, 9, 10, 12, 15, 18, 20, 22, 23, 25, 29, 31, 33, 37, 42, 45, 48, 49, 47, 47, 50, 50, 50, 51, 52, 53, 54, 55, 57, 59, 60, 62, 63, 64, 65, 65, 65, 65, 64, 64, 64, 63, 62, 62, 61, 61, 60, 60, 60, 60, 60, 59, 59, 58, 57, 56, 54, 52, 50, 49, 50, 50, 49, 48, 47, 46, 45, 45, 46, 46, 45, 42, 39, 37, 35, 34, 32, 30, 27, 23, 22, 21, 19, 19, 19, 18, 18, 19, 19, 18, 18, 18, 17, 17, 16, 15, 14, 14, 14, 13, 12, 11, 12, 11, 11, 10, 9, 9, 8, 8, 7, 6, 4, 2, 1, -0, -1, -1, -2, -3, -3, -3, -6, -9, -10, -11, -11, -13, -15, -17, -18, -19, -20, -21, -22, -22, -23, -24, -25, -25, -25, -26, -27, -27, -28, -27, -27, -27, -27, -27, -27, -28, -29, -29, -29, -29, -29, -30, -30, -31, -31, -31, -31, -31, -30, -30, -29, -29, -29, -29, -28, -27, -25, -25, -24, -24, -23, -22, -20, -19, -22, -22, -18, -14, -12, -12, -11, -10, -9, -8, -6, -5, -3, -1, -0, 1, 1, 2, 4, 7, 8, 9, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 15, 14, 14, 13, 13, 13, 13, 13, 12, 11, 11, 11, 10, 10, 11, 11, 11, 10, 8, 6, 4, 2, 3, 5, 5, 5, - /* 63.0 */ 4, 5, 5, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 9, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 14, 16, 17, 15, 15, 16, 17, 17, 17, 16, 15, 13, 12, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 2, 1, 0, -1, -3, -5, -8, -11, -12, -14, -16, -18, -20, -22, -23, -25, -27, -27, -28, -29, -30, -31, -32, -34, -35, -36, -38, -39, -41, -42, -43, -44, -45, -45, -45, -45, -45, -45, -45, -44, -44, -43, -43, -42, -41, -41, -40, -39, -38, -37, -36, -35, -33, -32, -31, -29, -28, -26, -23, -20, -16, -13, -11, -9, -6, -4, -1, 2, 7, 10, 11, 12, 14, 16, 18, 20, 22, 25, 28, 30, 32, 37, 41, 44, 47, 49, 50, 48, 46, 48, 50, 50, 51, 52, 52, 53, 55, 56, 57, 59, 61, 62, 63, 64, 65, 65, 65, 65, 65, 65, 63, 63, 63, 62, 61, 61, 61, 62, 62, 61, 60, 60, 59, 57, 56, 54, 52, 51, 50, 50, 49, 48, 47, 47, 45, 45, 45, 45, 44, 42, 41, 40, 37, 35, 33, 32, 31, 29, 25, 22, 20, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 16, 15, 15, 15, 14, 14, 14, 13, 13, 12, 12, 11, 11, 11, 9, 9, 9, 9, 8, 6, 4, 2, 1, 1, 1, -0, -2, -2, -2, -3, -6, -8, -10, -11, -11, -12, -13, -14, -16, -17, -18, -19, -20, -21, -21, -22, -23, -23, -23, -24, -24, -24, -25, -24, -25, -26, -26, -26, -27, -26, -27, -27, -27, -28, -29, -29, -29, -29, -30, -30, -30, -29, -30, -30, -29, -29, -29, -28, -26, -25, -24, -24, -23, -22, -22, -23, -22, -20, -18, -18, -17, -15, -14, -14, -13, -13, -12, -11, -11, -10, -8, -7, -6, -5, -4, -2, 1, 5, 7, 8, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 11, 12, 13, 13, 13, 13, 13, 13, 12, 12, 11, 12, 12, 11, 10, 10, 10, 9, 9, 9, 8, 7, 7, 6, 5, 5, 5, 4, - /* 64.0 */ 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 10, 11, 12, 12, 12, 13, 14, 14, 15, 15, 14, 13, 13, 13, 12, 12, 11, 10, 10, 9, 8, 7, 6, 5, 5, 4, 3, 2, -0, -3, -6, -8, -9, -11, -13, -14, -16, -18, -19, -21, -22, -23, -24, -25, -27, -28, -29, -30, -32, -34, -34, -35, -37, -39, -40, -42, -43, -44, -44, -43, -43, -42, -41, -41, -40, -40, -40, -40, -39, -39, -38, -37, -37, -36, -35, -34, -34, -33, -32, -31, -29, -28, -26, -23, -20, -16, -13, -11, -8, -4, -2, -2, -1, 1, 7, 12, 14, 15, 16, 19, 21, 22, 26, 28, 28, 29, 33, 36, 40, 43, 46, 49, 50, 50, 48, 45, 47, 50, 52, 53, 54, 54, 54, 55, 56, 58, 59, 61, 62, 63, 65, 65, 65, 66, 66, 66, 67, 67, 66, 65, 65, 64, 63, 63, 62, 61, 60, 58, 57, 55, 53, 52, 52, 52, 51, 51, 50, 49, 47, 45, 43, 42, 43, 43, 42, 41, 41, 39, 36, 34, 32, 31, 30, 30, 28, 26, 24, 21, 19, 18, 17, 18, 18, 18, 18, 18, 18, 17, 16, 16, 16, 15, 15, 15, 14, 14, 13, 13, 12, 11, 10, 9, 9, 9, 8, 7, 6, 5, 4, 2, 1, -0, -1, -2, -3, -2, -2, -4, -6, -8, -10, -11, -12, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -21, -21, -21, -22, -22, -22, -22, -23, -24, -25, -25, -25, -25, -24, -24, -25, -27, -28, -28, -28, -28, -28, -29, -29, -29, -28, -27, -26, -26, -26, -25, -24, -23, -22, -21, -20, -20, -20, -20, -20, -19, -18, -18, -18, -17, -16, -16, -15, -14, -13, -11, -9, -10, -9, -6, -3, -0, 1, 3, 4, 5, 6, 6, 6, 7, 8, 9, 9, 9, 11, 11, 10, 10, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 6, 5, 4, 4, 4, 4, - /* 65.0 */ 5, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 8, 7, 7, 5, 3, 2, -0, -3, -7, -10, -11, -11, -13, -15, -16, -16, -18, -19, -20, -20, -22, -22, -24, -25, -26, -28, -29, -31, -33, -34, -34, -36, -37, -38, -39, -40, -41, -41, -41, -41, -40, -39, -38, -38, -38, -37, -37, -37, -37, -36, -35, -33, -33, -33, -33, -32, -32, -30, -28, -26, -25, -23, -21, -19, -16, -13, -11, -8, -6, -5, -2, 1, 3, 6, 12, 16, 18, 19, 20, 22, 26, 28, 27, 27, 29, 33, 37, 40, 43, 46, 48, 49, 49, 48, 45, 44, 46, 48, 51, 54, 56, 56, 56, 56, 58, 59, 59, 61, 63, 64, 64, 65, 66, 66, 67, 67, 67, 67, 67, 66, 66, 64, 63, 62, 61, 60, 58, 57, 56, 54, 53, 53, 52, 52, 51, 51, 50, 48, 46, 45, 44, 43, 41, 41, 40, 40, 39, 38, 36, 34, 32, 31, 30, 29, 27, 25, 23, 20, 19, 18, 18, 18, 18, 17, 18, 18, 17, 17, 17, 17, 17, 17, 17, 15, 13, 13, 12, 11, 10, 9, 8, 8, 7, 7, 6, 6, 5, 4, 2, 1, -0, -0, -2, -3, -2, -1, -2, -4, -6, -8, -10, -11, -11, -13, -13, -14, -15, -16, -17, -18, -18, -19, -19, -19, -19, -20, -21, -20, -20, -20, -21, -22, -23, -23, -23, -23, -22, -23, -25, -25, -25, -25, -25, -25, -24, -24, -25, -25, -24, -23, -22, -22, -22, -21, -20, -19, -18, -18, -17, -17, -18, -18, -18, -18, -17, -17, -17, -17, -17, -17, -16, -14, -10, -7, -5, -4, -4, -3, -2, -0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 9, 9, 9, 10, 9, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 9, 9, 7, 7, 7, 6, 6, 5, 5, 5, 5, 5, - /* 66.0 */ 5, 4, 4, 4, 4, 4, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 9, 9, 10, 10, 9, 9, 9, 9, 9, 9, 9, 8, 7, 6, 6, 4, 2, -0, -2, -4, -5, -6, -7, -7, -9, -10, -12, -13, -15, -16, -17, -18, -19, -19, -19, -20, -21, -23, -24, -25, -27, -29, -30, -32, -33, -34, -36, -36, -37, -38, -38, -39, -39, -39, -38, -37, -37, -36, -36, -36, -36, -35, -34, -34, -34, -33, -33, -32, -31, -30, -30, -29, -28, -28, -26, -24, -23, -21, -18, -16, -13, -11, -8, -5, -1, 3, 6, 8, 9, 13, 17, 19, 21, 22, 24, 27, 28, 30, 31, 32, 34, 36, 39, 42, 44, 45, 47, 48, 48, 48, 48, 49, 49, 51, 53, 55, 57, 58, 58, 59, 60, 60, 61, 61, 62, 63, 64, 65, 65, 65, 66, 66, 65, 65, 65, 64, 63, 63, 62, 60, 58, 58, 56, 54, 54, 53, 52, 52, 51, 51, 50, 49, 47, 46, 45, 44, 43, 43, 42, 41, 40, 39, 37, 35, 34, 33, 32, 31, 30, 29, 28, 25, 23, 22, 20, 20, 19, 18, 18, 18, 18, 17, 17, 18, 18, 17, 16, 15, 15, 15, 14, 13, 12, 12, 12, 10, 8, 6, 6, 7, 6, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -6, -5, -4, -6, -8, -10, -11, -12, -13, -14, -16, -17, -17, -17, -17, -17, -17, -17, -18, -19, -19, -19, -18, -19, -20, -21, -22, -22, -22, -22, -23, -23, -22, -22, -22, -23, -23, -22, -22, -22, -22, -21, -21, -20, -20, -19, -18, -17, -17, -16, -16, -15, -15, -15, -16, -15, -15, -15, -15, -14, -14, -15, -15, -14, -12, -8, -6, -4, -4, -5, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 5, 5, 5, 7, 8, 8, 7, 5, 4, 5, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 9, 9, 8, 8, 8, 6, 6, 6, 6, 5, 5, 5, 5, - /* 67.0 */ 5, 5, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9, 9, 9, 9, 8, 7, 7, 7, 7, 7, 7, 7, 6, 5, 4, 4, 2, -0, -1, -2, -3, -4, -5, -5, -6, -8, -9, -10, -12, -13, -15, -16, -16, -17, -18, -19, -20, -22, -23, -25, -26, -28, -30, -31, -32, -33, -34, -35, -36, -36, -37, -37, -37, -37, -37, -36, -35, -34, -34, -33, -32, -31, -31, -32, -32, -31, -31, -30, -29, -28, -28, -27, -27, -26, -26, -24, -22, -21, -19, -16, -14, -10, -7, -3, 1, 6, 8, 7, 8, 11, 15, 18, 19, 21, 23, 25, 26, 26, 28, 30, 31, 33, 36, 39, 41, 43, 44, 46, 47, 48, 48, 49, 50, 53, 55, 56, 57, 57, 57, 57, 58, 58, 59, 60, 60, 60, 61, 62, 63, 63, 64, 64, 64, 64, 63, 63, 63, 62, 60, 59, 58, 57, 56, 55, 54, 53, 52, 52, 51, 51, 50, 49, 48, 48, 47, 45, 43, 43, 42, 43, 42, 41, 40, 38, 36, 33, 31, 30, 31, 31, 31, 30, 28, 26, 24, 23, 22, 20, 19, 18, 18, 18, 17, 17, 17, 17, 18, 18, 17, 16, 15, 14, 13, 12, 12, 11, 9, 8, 7, 8, 7, 6, 4, 3, 2, 1, 0, -0, -1, -2, -3, -4, -5, -7, -7, -6, -5, -5, -7, -8, -10, -12, -13, -14, -15, -15, -15, -15, -15, -15, -16, -16, -16, -17, -17, -17, -18, -17, -18, -18, -19, -20, -20, -19, -20, -20, -20, -20, -20, -19, -19, -20, -20, -19, -18, -18, -19, -19, -18, -18, -17, -17, -16, -15, -15, -14, -14, -13, -13, -12, -12, -12, -12, -12, -13, -14, -14, -11, -8, -5, -5, -5, -5, -5, -4, -3, -2, -2, -1, 0, 3, 3, 3, 3, 5, 6, 5, 2, 2, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 8, 8, 8, 7, 7, 6, 6, 6, 6, 6, 6, 5, - /* 68.0 */ 5, 4, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 5, 6, 8, 8, 7, 7, 8, 9, 9, 9, 9, 8, 8, 8, 7, 7, 6, 5, 4, 3, 2, 0, -2, -2, -2, -2, -3, -5, -6, -6, -7, -8, -8, -9, -10, -10, -11, -12, -15, -17, -18, -19, -21, -23, -25, -26, -28, -29, -30, -31, -32, -32, -33, -33, -34, -35, -35, -35, -35, -35, -35, -34, -34, -33, -32, -30, -30, -30, -30, -31, -31, -30, -28, -26, -26, -26, -26, -25, -24, -23, -22, -21, -19, -17, -14, -12, -9, -5, -2, 0, 2, 3, 6, 9, 12, 14, 17, 19, 22, 24, 25, 25, 25, 25, 26, 27, 29, 32, 34, 36, 38, 40, 42, 43, 45, 46, 47, 48, 49, 51, 54, 56, 56, 56, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 60, 61, 61, 62, 62, 62, 62, 61, 61, 60, 59, 59, 58, 57, 56, 55, 54, 52, 51, 51, 51, 50, 49, 49, 48, 48, 48, 47, 45, 44, 42, 41, 41, 41, 41, 41, 39, 36, 32, 30, 30, 31, 32, 31, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 18, 18, 18, 18, 18, 17, 16, 15, 14, 13, 11, 11, 11, 10, 10, 9, 9, 8, 6, 5, 4, 3, 2, 1, -0, -1, -1, -2, -3, -3, -4, -5, -6, -7, -7, -6, -6, -7, -9, -11, -12, -13, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -16, -16, -16, -15, -16, -17, -17, -18, -18, -17, -17, -16, -16, -16, -17, -16, -16, -16, -17, -16, -16, -16, -16, -17, -16, -17, -16, -16, -15, -15, -15, -14, -13, -12, -12, -11, -11, -11, -11, -12, -14, -15, -16, -14, -10, -7, -5, -5, -5, -5, -4, -4, -3, -2, -1, 1, 1, 1, 2, 1, 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, - /* 69.0 */ 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 7, 7, 7, 5, 4, 3, 1, -2, -4, -5, -6, -6, -6, -6, -6, -7, -8, -8, -9, -9, -9, -8, -8, -9, -11, -12, -14, -15, -17, -18, -19, -20, -21, -22, -23, -26, -28, -30, -30, -31, -31, -32, -31, -31, -31, -32, -32, -32, -32, -31, -31, -30, -29, -28, -28, -28, -28, -28, -28, -27, -25, -24, -23, -24, -23, -22, -21, -21, -19, -17, -14, -11, -9, -6, -4, -2, -0, 1, 1, 4, 9, 13, 15, 16, 18, 21, 24, 25, 26, 27, 26, 24, 23, 24, 26, 29, 31, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51, 53, 55, 54, 55, 57, 59, 59, 60, 61, 61, 60, 59, 59, 59, 59, 59, 60, 60, 61, 61, 60, 60, 60, 59, 58, 58, 57, 56, 54, 52, 52, 51, 51, 50, 49, 49, 49, 48, 47, 47, 46, 45, 44, 43, 43, 41, 40, 39, 39, 39, 38, 37, 35, 33, 32, 31, 31, 30, 29, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 17, 16, 15, 14, 13, 13, 12, 11, 10, 10, 9, 8, 8, 7, 6, 4, 4, 3, 2, 1, 0, -0, -1, -2, -3, -3, -4, -5, -5, -5, -6, -7, -7, -8, -8, -9, -10, -11, -11, -12, -12, -12, -12, -12, -13, -13, -13, -14, -14, -14, -15, -15, -15, -14, -14, -15, -16, -16, -15, -15, -15, -14, -14, -15, -15, -16, -17, -17, -16, -16, -15, -15, -15, -15, -14, -14, -13, -13, -12, -12, -12, -12, -12, -12, -11, -10, -10, -10, -12, -13, -14, -14, -13, -11, -7, -5, -5, -6, -5, -4, -4, -3, -2, -2, -1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, - /* 70.0 */ 3, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, -0, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -1, -1, -2, -2, -2, -1, -2, -2, -2, -2, -3, -3, -3, -4, -4, -4, -4, -5, -6, -7, -7, -8, -9, -9, -10, -11, -11, -12, -13, -13, -14, -15, -17, -18, -18, -18, -18, -18, -19, -20, -22, -25, -27, -28, -28, -28, -28, -29, -29, -28, -28, -28, -28, -28, -27, -27, -26, -25, -25, -25, -26, -26, -26, -25, -25, -24, -22, -21, -21, -20, -20, -18, -17, -15, -13, -11, -8, -5, -2, -1, 1, 3, 4, 4, 5, 7, 10, 14, 16, 19, 21, 23, 24, 26, 27, 28, 28, 27, 26, 26, 27, 30, 32, 35, 36, 38, 39, 40, 42, 43, 44, 46, 47, 48, 50, 52, 54, 55, 55, 56, 57, 57, 57, 56, 57, 58, 58, 57, 56, 57, 58, 60, 59, 59, 59, 59, 59, 59, 59, 58, 57, 56, 55, 54, 52, 51, 51, 51, 51, 50, 50, 49, 48, 47, 47, 46, 45, 45, 44, 43, 43, 42, 41, 40, 39, 39, 38, 37, 35, 33, 31, 30, 28, 28, 27, 25, 24, 25, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 14, 13, 12, 11, 10, 10, 9, 8, 7, 6, 6, 5, 4, 3, 2, 2, 1, -0, -1, -2, -2, -2, -2, -3, -4, -5, -6, -7, -7, -8, -8, -9, -9, -9, -10, -10, -10, -10, -10, -11, -11, -11, -12, -13, -13, -14, -14, -14, -14, -15, -14, -14, -13, -13, -13, -12, -12, -13, -14, -14, -15, -15, -15, -15, -15, -15, -15, -14, -13, -12, -11, -10, -9, -9, -10, -11, -11, -11, -11, -11, -11, -10, -10, -9, -8, -9, -9, -9, -10, -10, -10, -9, -7, -6, -6, -6, -5, -4, -3, -2, -2, -1, -1, -1, -1, -1, -1, -1, -0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, - /* 71.0 */ 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 0, -0, -0, -0, -0, -1, -1, -1, -1, -1, -1, -2, -2, -2, -3, -3, -4, -4, -4, -4, -3, -2, -3, -4, -5, -6, -6, -6, -6, -5, -5, -4, -3, -3, -4, -5, -7, -9, -10, -11, -12, -12, -13, -13, -14, -15, -15, -15, -16, -16, -17, -17, -17, -18, -19, -21, -23, -24, -25, -25, -25, -25, -25, -26, -26, -25, -24, -23, -23, -22, -21, -20, -19, -20, -21, -21, -21, -20, -20, -19, -18, -18, -17, -16, -15, -13, -12, -10, -8, -6, -4, -2, -0, 1, 2, 3, 3, 5, 8, 10, 12, 14, 16, 17, 19, 22, 24, 26, 26, 27, 28, 29, 28, 28, 28, 30, 32, 34, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 49, 50, 51, 52, 53, 53, 54, 55, 54, 54, 54, 54, 53, 53, 55, 56, 56, 57, 57, 56, 57, 57, 57, 57, 58, 57, 57, 56, 56, 55, 54, 54, 53, 53, 52, 52, 51, 50, 49, 48, 47, 46, 46, 45, 44, 44, 43, 42, 42, 41, 40, 40, 39, 37, 35, 33, 31, 29, 28, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 17, 16, 16, 15, 15, 13, 12, 11, 10, 9, 9, 8, 8, 8, 7, 6, 5, 3, 3, 2, 2, 1, 1, 0, -1, -1, -2, -3, -4, -5, -6, -7, -7, -7, -7, -8, -8, -8, -9, -9, -10, -10, -10, -10, -9, -9, -10, -11, -11, -12, -12, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -14, -14, -13, -13, -12, -12, -12, -13, -13, -12, -11, -10, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -8, -8, -7, -7, -7, -7, -7, -8, -8, -8, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -2, -1, -1, -1, -1, -0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 2, 3, - /* 72.0 */ 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, -0, -0, 0, 0, 1, 0, 0, -0, -1, -1, -2, -2, -3, -3, -4, -6, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -6, -5, -4, -5, -7, -10, -11, -10, -10, -10, -9, -10, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -22, -22, -23, -23, -22, -21, -20, -19, -18, -18, -18, -17, -16, -17, -17, -17, -16, -15, -14, -13, -13, -12, -11, -10, -9, -8, -8, -6, -4, -1, 1, 1, 2, 4, 7, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 26, 26, 25, 26, 27, 28, 30, 32, 34, 35, 36, 37, 37, 38, 39, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 49, 50, 50, 51, 51, 51, 51, 53, 54, 53, 53, 53, 53, 54, 55, 55, 54, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 51, 51, 50, 49, 49, 48, 47, 46, 45, 44, 43, 42, 42, 41, 41, 41, 40, 38, 36, 34, 33, 31, 29, 27, 26, 24, 23, 22, 21, 20, 19, 18, 18, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 7, 6, 6, 5, 4, 3, 3, 2, 2, 2, 1, -1, -2, -2, -3, -3, -4, -5, -5, -6, -6, -6, -7, -7, -7, -7, -8, -8, -8, -8, -8, -8, -8, -9, -10, -11, -11, -11, -11, -12, -12, -12, -13, -13, -13, -13, -13, -13, -14, -14, -14, -13, -13, -13, -13, -12, -13, -14, -14, -13, -12, -12, -11, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, - /* 73.0 */ 2, 2, 2, 1, 1, 0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -1, -1, -1, -2, -3, -4, -5, -6, -7, -8, -8, -8, -8, -8, -8, -7, -7, -7, -8, -8, -8, -8, -8, -8, -9, -9, -9, -9, -9, -8, -7, -7, -7, -8, -10, -10, -10, -10, -9, -9, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -20, -20, -20, -20, -20, -21, -20, -19, -18, -17, -16, -15, -15, -14, -13, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -8, -6, -5, -5, -3, -1, 2, 3, 4, 6, 9, 12, 13, 13, 14, 14, 14, 15, 16, 17, 19, 22, 24, 22, 20, 20, 21, 22, 23, 24, 26, 29, 31, 32, 34, 36, 37, 37, 37, 37, 38, 39, 40, 41, 42, 42, 43, 45, 46, 47, 48, 48, 49, 49, 49, 48, 48, 49, 50, 50, 49, 50, 51, 51, 51, 52, 53, 53, 52, 51, 51, 50, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 49, 49, 49, 49, 49, 48, 48, 47, 46, 46, 45, 44, 43, 43, 42, 42, 41, 40, 37, 35, 33, 31, 30, 29, 28, 26, 24, 23, 22, 21, 20, 19, 18, 17, 17, 16, 16, 15, 14, 14, 13, 12, 10, 10, 9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 2, 2, 2, 2, 1, -0, -2, -2, -3, -3, -4, -4, -4, -5, -5, -5, -6, -6, -6, -7, -7, -7, -7, -7, -8, -8, -9, -9, -9, -9, -9, -10, -10, -11, -11, -12, -12, -12, -11, -11, -11, -11, -11, -12, -13, -13, -13, -12, -12, -12, -12, -13, -13, -13, -12, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -3, -3, -3, -3, -2, -2, -1, -1, -1, -1, -0, -0, -0, -0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - /* 74.0 */ 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 1, 1, 0, 0, -0, -1, -3, -4, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -6, -5, -4, -4, -5, -6, -7, -7, -8, -9, -9, -9, -10, -10, -10, -9, -9, -7, -6, -5, -5, -7, -9, -9, -9, -9, -10, -10, -11, -12, -12, -13, -14, -15, -15, -15, -16, -16, -17, -17, -17, -17, -17, -17, -17, -16, -16, -15, -14, -13, -12, -12, -12, -11, -10, -10, -10, -10, -10, -10, -9, -8, -8, -7, -6, -5, -4, -3, -1, 1, 3, 6, 8, 11, 13, 14, 15, 15, 16, 16, 16, 17, 18, 20, 21, 20, 19, 18, 18, 20, 21, 22, 24, 25, 27, 29, 30, 32, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 50, 50, 51, 50, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 46, 45, 45, 45, 45, 45, 45, 44, 43, 43, 42, 41, 40, 39, 39, 38, 36, 35, 33, 31, 29, 28, 26, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 2, 1, 0, -1, -2, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -5, -6, -6, -7, -7, -8, -8, -8, -8, -8, -9, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -10, -11, -11, -11, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -7, -6, -6, -6, -5, -5, -5, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 2, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - /* 75.0 */ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 1, 1, 0, -0, -1, -1, -2, -2, -2, -3, -4, -4, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -5, -6, -6, -7, -7, -8, -8, -9, -9, -9, -9, -8, -7, -6, -4, -3, -4, -6, -8, -10, -10, -11, -11, -11, -12, -12, -12, -12, -11, -11, -12, -12, -12, -13, -13, -14, -14, -14, -14, -14, -14, -13, -12, -12, -11, -10, -9, -9, -8, -7, -7, -7, -6, -5, -4, -3, -2, -1, 1, 2, 4, 6, 7, 7, 6, 5, 7, 9, 12, 14, 15, 16, 17, 18, 18, 19, 19, 19, 19, 18, 18, 17, 17, 18, 19, 20, 21, 22, 23, 25, 27, 28, 30, 31, 32, 32, 33, 33, 34, 35, 36, 36, 36, 37, 37, 38, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 45, 45, 46, 47, 47, 47, 45, 44, 44, 44, 45, 45, 46, 47, 47, 47, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 44, 43, 42, 42, 41, 41, 40, 40, 40, 40, 40, 37, 35, 33, 31, 30, 29, 28, 27, 26, 24, 23, 22, 21, 21, 20, 19, 18, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 3, 3, 2, 1, -1, -2, -2, -3, -3, -4, -4, -4, -4, -5, -5, -5, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -0, -0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - /* 76.0 */ 2, 2, 2, 1, -0, -1, -0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -2, -3, -3, -3, -3, -3, -3, -3, -4, -4, -4, -5, -5, -6, -6, -6, -7, -7, -8, -8, -8, -8, -8, -7, -6, -5, -5, -5, -5, -5, -6, -7, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -6, -5, -5, -4, -3, -2, -2, -2, -1, -1, -1, -0, 1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 19, 19, 20, 21, 21, 22, 24, 25, 27, 28, 29, 30, 31, 31, 32, 32, 32, 33, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 47, 46, 44, 42, 40, 39, 38, 38, 38, 38, 38, 38, 39, 41, 42, 42, 43, 43, 44, 45, 44, 44, 43, 43, 43, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 42, 42, 41, 41, 40, 39, 40, 40, 39, 37, 34, 32, 31, 30, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 18, 17, 16, 15, 14, 13, 12, 11, 11, 10, 10, 9, 8, 8, 7, 7, 6, 5, 5, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 1, 1, -0, -1, -1, -2, -3, -3, -4, -4, -5, -5, -5, -6, -6, -7, -7, -7, -6, -6, -6, -7, -7, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -0, -0, -1, -0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 2, - /* 77.0 */ 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 0, -0, -1, -1, -1, -1, -2, -2, -3, -3, -2, -3, -3, -4, -4, -4, -5, -5, -6, -6, -6, -6, -7, -7, -7, -7, -7, -6, -6, -6, -5, -4, -3, -3, -3, -3, -4, -5, -5, -5, -5, -5, -6, -6, -6, -7, -7, -8, -8, -8, -8, -8, -8, -7, -7, -6, -7, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -3, -3, -2, -1, -0, 1, 3, 5, 6, 6, 7, 7, 8, 9, 9, 9, 9, 9, 10, 10, 11, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 23, 24, 24, 24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 31, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 42, 42, 43, 43, 43, 43, 42, 41, 39, 36, 33, 31, 31, 33, 33, 33, 33, 33, 34, 36, 38, 39, 40, 40, 41, 42, 42, 42, 42, 41, 41, 41, 41, 42, 41, 41, 41, 42, 42, 41, 41, 40, 40, 40, 39, 38, 38, 37, 35, 33, 32, 30, 30, 29, 29, 28, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 17, 16, 15, 15, 14, 13, 13, 12, 11, 11, 10, 9, 9, 8, 7, 7, 6, 6, 5, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 0, -1, -2, -2, -3, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -6, -5, -5, -5, -4, -4, -4, -4, -4, -3, -2, -2, -2, -2, -2, -2, -1, -0, -0, 0, 0, -0, -0, -1, -0, 0, 0, 1, 1, 1, 2, 2, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, - /* 78.0 */ 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 3, 3, 2, 2, 1, 0, 0, -0, -0, -0, -1, -2, -3, -3, -3, -3, -3, -3, -4, -4, -4, -5, -5, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -4, -4, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -2, -1, -1, -1, -1, -1, -1, -1, -0, 1, 2, 4, 5, 6, 8, 9, 10, 10, 10, 10, 9, 9, 9, 9, 10, 12, 14, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 39, 38, 37, 36, 35, 34, 32, 31, 30, 29, 30, 30, 31, 31, 31, 31, 31, 33, 35, 36, 36, 36, 37, 38, 39, 40, 39, 39, 38, 38, 38, 39, 39, 39, 40, 40, 40, 39, 39, 39, 39, 38, 37, 35, 34, 32, 32, 32, 31, 30, 29, 29, 29, 28, 27, 26, 24, 24, 23, 22, 21, 20, 19, 19, 18, 17, 17, 16, 16, 15, 14, 14, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8, 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 2, 1, 1, 0, -0, -0, -1, -1, -1, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -4, -3, -3, -2, -2, -2, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -1, -0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, - /* 79.0 */ 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, -0, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -2, -1, -1, -0, 0, 1, 1, 0, -0, -1, -1, -1, -1, -1, -1, -1, -0, 0, 1, 1, 1, 0, 1, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 5, 5, 5, 5, 6, 8, 9, 10, 11, 11, 11, 10, 8, 8, 7, 7, 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 36, 35, 34, 33, 32, 31, 30, 29, 29, 28, 28, 29, 29, 30, 30, 30, 30, 31, 31, 32, 33, 34, 35, 36, 37, 37, 36, 36, 35, 36, 36, 37, 37, 37, 37, 38, 38, 39, 39, 38, 38, 37, 37, 36, 35, 35, 35, 34, 33, 32, 30, 29, 28, 28, 27, 26, 25, 24, 24, 23, 22, 22, 21, 20, 20, 19, 18, 18, 17, 17, 16, 15, 15, 14, 14, 14, 13, 13, 12, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -1, -1, -0, 0, 0, 1, 1, 1, 1, 1, -0, -1, -2, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, - /* 80.0 */ 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, 0, 1, 2, 2, 3, 4, 4, 5, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 3, 3, 4, 5, 5, 6, 8, 9, 10, 11, 11, 11, 10, 9, 8, 8, 8, 9, 10, 12, 13, 15, 15, 15, 15, 14, 13, 12, 10, 9, 8, 7, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 37, 37, 37, 36, 36, 35, 34, 33, 33, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 32, 32, 32, 32, 33, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 33, 33, 32, 31, 30, 30, 29, 29, 29, 28, 27, 27, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 20, 20, 19, 18, 18, 17, 17, 16, 16, 16, 15, 14, 14, 13, 13, 12, 12, 11, 11, 11, 11, 11, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 0, -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, 0, 0, -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 0, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, - /* 81.0 */ 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 17, 16, 16, 16, 17, 17, 18, 19, 19, 19, 18, 17, 15, 14, 12, 12, 11, 12, 12, 14, 15, 16, 18, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 34, 35, 35, 34, 34, 34, 35, 35, 35, 35, 35, 34, 33, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 33, 33, 33, 32, 31, 31, 31, 31, 32, 32, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 29, 29, 28, 28, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 21, 21, 20, 20, 19, 19, 18, 18, 18, 18, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 14, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, - /* 82.0 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 18, 17, 17, 16, 16, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 21, 22, 24, 25, 26, 27, 29, 29, 30, 31, 31, 31, 32, 32, 32, 32, 32, 32, 31, 31, 30, 30, 29, 29, 28, 27, 27, 27, 27, 27, 28, 29, 30, 31, 31, 32, 32, 31, 31, 30, 30, 29, 29, 29, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 31, 31, 31, 30, 30, 29, 28, 28, 27, 27, 26, 26, 26, 26, 25, 24, 24, 23, 23, 22, 22, 22, 22, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 15, 14, 13, 12, 12, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 7, 7, 8, 8, 8, 8, 8, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - /* 83.0 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 22, 22, 22, 21, 21, 21, 21, 20, 20, 19, 19, 19, 18, 18, 18, 18, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 7, 6, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, - /* 84.0 */ 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 22, 22, 22, 22, 21, 21, 21, 21, 20, 20, 20, 19, 19, 19, 19, 18, 18, 18, 18, 17, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - /* 85.0 */ 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 9, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - /* 86.0 */ 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 23, 23, 22, 22, 22, 21, 21, 21, 21, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - /* 87.0 */ 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - /* 88.0 */ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - /* 89.0 */ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - /* 90.0 */ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }; -#endif // HEIGHT_H_INCLUDED_ + +#endif // FILTERS_ENABLED +#endif // HEIGHT_H_INCLUDED_ diff --git a/heightgrid.h b/heightgrid.h new file mode 100644 index 000000000..4acb0342c --- /dev/null +++ b/heightgrid.h @@ -0,0 +1,214 @@ +/* + Copyright (C) 2013 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ +#ifndef HEIGHTGRID_H_INCLUDED_ +#define HEIGHTGRID_H_INCLUDED_ + +/* Created by "tools/createGeoidGrid 1.0 int8_t" using GeographicLib utility GeoidEval with egm96-5. */ + +#include + +#define GEOID_GRID_DEG 1.0 +#define GEOID_SCALE 1.0 +#define GEOID_ROW 181 +#define GEOID_COL 361 +static const int8_t geoid_delta[GEOID_COL* GEOID_ROW]= { + /* -180,-179,-178,-177,-176,-175,-174,-173,-172,-171,-170,-169,-168,-167,-166,-165,-164,-163,-162,-161,-160,-159,-158,-157,-156,-155,-154,-153,-152,-151,-150,-149,-148,-147,-146,-145,-144,-143,-142,-141,-140,-139,-138,-137,-136,-135,-134,-133,-132,-131,-130,-129,-128,-127,-126,-125,-124,-123,-122,-121,-120,-119,-118,-117,-116,-115,-114,-113,-112,-111,-110,-109,-108,-107,-106,-105,-104,-103,-102,-101,-100, -99, -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -86, -85, -84, -83, -82, -81, -80, -79, -78, -77, -76, -75, -74, -73, -72, -71, -70, -69, -68, -67, -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180 */ + /* -90.0 */ -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, + /* -89.0 */ -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, + /* -88.0 */ -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -30, + /* -87.0 */ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -26, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -21, -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -20, -20, -20, -20, -20, -20, -20, -20, -20, -21, -21, -21, -21, -21, -21, -22, -22, -22, -22, -22, -22, -22, -22, -22, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -24, -24, -25, -25, -25, -25, -25, -26, -26, -26, -26, -27, -27, -27, -27, -28, -28, -28, -28, -28, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -31, -31, -31, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, -32, -32, -32, -32, -32, -32, -32, -32, + /* -86.0 */ -33, -33, -34, -34, -34, -34, -34, -34, -34, -34, -35, -35, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -36, -36, -35, -35, -34, -34, -33, -33, -32, -32, -32, -32, -32, -32, -32, -33, -33, -34, -34, -34, -34, -34, -34, -33, -33, -32, -32, -31, -31, -31, -31, -31, -31, -32, -32, -32, -32, -32, -32, -32, -31, -31, -30, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -27, -27, -26, -26, -25, -24, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -24, -25, -25, -25, -25, -26, -26, -26, -26, -27, -27, -26, -26, -26, -25, -24, -24, -23, -22, -21, -21, -20, -20, -20, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -16, -16, -16, -16, -16, -17, -17, -17, -17, -17, -18, -18, -18, -18, -19, -19, -19, -19, -20, -20, -20, -20, -21, -21, -21, -22, -22, -22, -23, -23, -23, -23, -24, -24, -24, -24, -25, -25, -25, -26, -26, -27, -27, -27, -28, -28, -28, -29, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32, -32, -32, -32, -33, -33, -33, -33, -33, -33, -34, -34, -34, -34, -34, -34, -34, -34, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -34, -34, -34, -34, -33, -33, -33, -33, -33, -33, -33, -33, -33, + /* -85.0 */ -37, -38, -39, -39, -40, -40, -40, -39, -39, -39, -39, -39, -40, -40, -41, -41, -41, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -43, -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -38, -38, -38, -37, -37, -38, -38, -38, -38, -38, -38, -37, -37, -36, -35, -35, -34, -34, -34, -34, -34, -34, -34, -35, -35, -34, -34, -33, -32, -32, -31, -30, -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26, -26, -26, -26, -27, -27, -28, -28, -29, -29, -30, -30, -30, -30, -29, -29, -29, -28, -28, -27, -27, -26, -25, -25, -24, -23, -23, -22, -22, -23, -23, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -24, -25, -25, -25, -25, -25, -25, -25, -24, -23, -22, -21, -19, -18, -18, -17, -17, -17, -18, -18, -18, -19, -19, -19, -19, -18, -18, -18, -17, -17, -17, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -13, -13, -14, -14, -14, -15, -15, -16, -16, -16, -17, -17, -18, -18, -19, -19, -20, -20, -20, -21, -21, -21, -22, -22, -22, -23, -23, -24, -24, -24, -25, -25, -26, -26, -26, -27, -28, -28, -29, -29, -30, -30, -31, -32, -32, -32, -33, -33, -34, -34, -34, -35, -35, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -36, -36, -37, -37, -37, -37, -36, -36, -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -36, -36, -36, -35, -35, -36, -36, -37, -37, -38, -38, -38, -37, -37, -36, -35, -35, -34, -34, -35, -36, -37, + /* -84.0 */ -44, -45, -45, -45, -45, -45, -45, -45, -44, -44, -44, -44, -45, -45, -45, -45, -44, -44, -44, -44, -44, -44, -44, -44, -45, -45, -45, -45, -44, -44, -44, -44, -43, -43, -43, -43, -42, -42, -42, -41, -41, -41, -41, -41, -41, -40, -40, -40, -40, -40, -39, -39, -39, -39, -39, -39, -39, -38, -38, -38, -37, -37, -36, -36, -36, -36, -36, -35, -35, -34, -34, -33, -32, -32, -31, -31, -30, -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -27, -27, -26, -26, -26, -25, -25, -24, -24, -24, -24, -24, -25, -25, -26, -26, -26, -25, -25, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -22, -22, -21, -21, -20, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -19, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -15, -15, -15, -15, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -10, -9, -9, -8, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -7, -7, -7, -7, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -7, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -12, -12, -13, -13, -13, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -19, -19, -20, -20, -21, -22, -22, -22, -23, -23, -24, -24, -25, -26, -26, -27, -28, -28, -29, -30, -30, -31, -32, -33, -33, -34, -35, -35, -35, -36, -36, -36, -36, -37, -37, -37, -37, -37, -37, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, -37, -37, -37, -36, -36, -35, -35, -34, -34, -34, -34, -34, -34, -34, -35, -36, -37, -38, -39, -41, -41, -42, -42, -42, -42, -42, -42, -43, -43, -44, + /* -83.0 */ -45, -45, -46, -46, -46, -46, -46, -46, -46, -46, -47, -47, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, -45, -45, -44, -44, -44, -44, -44, -44, -44, -43, -43, -43, -43, -42, -42, -42, -42, -42, -42, -42, -41, -41, -41, -41, -41, -40, -40, -40, -39, -39, -38, -38, -38, -37, -37, -36, -36, -35, -35, -34, -33, -32, -32, -31, -31, -30, -30, -29, -29, -29, -29, -30, -30, -30, -30, -30, -30, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -28, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -24, -24, -23, -22, -22, -21, -21, -20, -20, -20, -21, -21, -21, -21, -21, -21, -20, -20, -19, -19, -18, -18, -18, -18, -17, -17, -17, -17, -17, -18, -18, -18, -18, -18, -17, -16, -16, -15, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -11, -11, -11, -11, -10, -10, -9, -8, -6, -5, -5, -4, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -4, -4, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -6, -7, -7, -8, -8, -9, -9, -10, -10, -11, -11, -12, -12, -13, -14, -15, -15, -16, -17, -18, -18, -19, -20, -20, -21, -22, -22, -23, -23, -24, -25, -25, -26, -27, -28, -28, -29, -30, -31, -31, -32, -32, -33, -34, -34, -35, -36, -37, -37, -38, -39, -39, -39, -39, -39, -39, -39, -40, -40, -41, -41, -41, -41, -41, -41, -40, -40, -40, -40, -40, -40, -40, -39, -39, -38, -37, -37, -36, -36, -36, -37, -38, -38, -39, -39, -40, -40, -41, -41, -42, -42, -43, -44, -44, -44, -45, -45, -45, -45, -45, -45, + /* -82.0 */ -48, -48, -48, -48, -48, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -48, -48, -48, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -46, -45, -45, -45, -45, -45, -45, -44, -44, -44, -43, -43, -43, -42, -42, -42, -42, -42, -42, -41, -41, -41, -40, -39, -39, -38, -38, -37, -37, -36, -36, -35, -35, -35, -34, -34, -33, -33, -33, -32, -32, -31, -31, -30, -30, -30, -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -28, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -28, -28, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -24, -24, -23, -23, -23, -23, -24, -24, -24, -23, -22, -21, -20, -20, -20, -20, -19, -19, -19, -18, -17, -17, -17, -17, -17, -17, -17, -16, -15, -14, -13, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -3, -2, -1, -0, 0, 1, 1, 1, 1, 1, 1, 0, 0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 0, -0, -1, -1, -2, -3, -3, -4, -4, -5, -6, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -16, -17, -18, -19, -19, -20, -21, -21, -22, -23, -24, -25, -26, -26, -27, -28, -29, -30, -31, -31, -32, -33, -33, -34, -35, -36, -37, -38, -39, -40, -41, -41, -40, -40, -41, -41, -42, -43, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, -43, -43, -42, -41, -40, -40, -41, -42, -44, -45, -45, -46, -46, -46, -47, -47, -47, -47, -47, -47, -47, -48, -48, -48, -48, -48, -48, -48, + /* -81.0 */ -50, -50, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -49, -49, -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -45, -45, -44, -44, -43, -42, -41, -41, -41, -41, -41, -41, -40, -40, -40, -40, -39, -39, -38, -38, -37, -37, -37, -36, -36, -36, -35, -35, -34, -33, -32, -32, -32, -31, -31, -30, -29, -28, -28, -27, -27, -27, -27, -26, -26, -26, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -25, -25, -25, -25, -24, -24, -23, -23, -23, -23, -23, -23, -24, -24, -24, -24, -25, -25, -25, -25, -25, -25, -25, -24, -24, -23, -23, -22, -22, -22, -21, -21, -20, -20, -20, -20, -20, -20, -19, -19, -18, -18, -17, -16, -16, -16, -16, -16, -15, -15, -15, -14, -14, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -3, -2, -2, -1, -1, -0, 0, 1, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 4, 3, 2, 2, 1, 1, -0, -1, -1, -1, -2, -3, -4, -5, -6, -8, -9, -10, -11, -11, -13, -14, -15, -15, -16, -17, -18, -19, -20, -21, -21, -22, -24, -25, -26, -27, -28, -29, -30, -30, -31, -32, -33, -33, -34, -35, -36, -37, -38, -39, -39, -40, -40, -40, -41, -41, -42, -43, -44, -45, -46, -46, -47, -47, -47, -47, -47, -47, -48, -48, -48, -48, -48, -49, -49, -50, -49, -48, -47, -45, -45, -46, -47, -48, -50, -50, -50, -50, -49, -49, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + /* -80.0 */ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -52, -52, -53, -53, -53, -53, -53, -53, -53, -52, -52, -52, -52, -52, -53, -53, -52, -52, -52, -51, -51, -51, -51, -50, -50, -49, -49, -49, -48, -48, -48, -47, -47, -47, -46, -46, -45, -44, -42, -42, -41, -41, -41, -41, -41, -40, -40, -40, -39, -39, -38, -38, -38, -38, -38, -38, -38, -38, -38, -37, -36, -35, -34, -33, -33, -32, -31, -30, -29, -28, -27, -26, -26, -25, -25, -24, -23, -23, -22, -22, -23, -23, -23, -22, -22, -22, -22, -23, -24, -25, -25, -25, -24, -24, -23, -23, -23, -23, -23, -22, -22, -21, -21, -21, -21, -21, -20, -20, -20, -21, -21, -21, -22, -22, -22, -22, -22, -21, -21, -20, -19, -18, -17, -17, -17, -17, -18, -18, -18, -18, -18, -17, -17, -17, -17, -18, -19, -19, -18, -17, -16, -15, -15, -15, -15, -15, -15, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 8, 9, 9, 9, 8, 8, 7, 7, 7, 6, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 5, 4, 4, 3, 3, 2, 2, 1, 0, -0, -1, -1, -2, -3, -4, -6, -7, -8, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -27, -28, -29, -30, -30, -31, -32, -33, -34, -35, -36, -37, -38, -39, -39, -40, -40, -40, -41, -42, -42, -43, -44, -44, -45, -46, -47, -48, -49, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -51, -51, -51, -51, -51, -51, -52, -53, -54, -55, -54, -54, -53, -52, -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, -52, -52, -52, -52, -53, + /* -79.0 */ -54, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, -54, -54, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -52, -51, -51, -50, -50, -50, -50, -50, -51, -51, -51, -50, -49, -48, -47, -47, -46, -46, -45, -44, -43, -42, -42, -41, -41, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -36, -36, -36, -36, -35, -35, -34, -34, -34, -34, -33, -32, -31, -31, -30, -29, -28, -27, -26, -26, -25, -23, -22, -21, -20, -19, -18, -16, -15, -17, -20, -23, -25, -25, -24, -23, -23, -23, -23, -23, -23, -22, -22, -22, -21, -20, -20, -20, -20, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -17, -16, -15, -15, -15, -15, -16, -16, -16, -16, -16, -15, -15, -15, -15, -14, -15, -15, -15, -14, -13, -12, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -3, -3, -2, -2, -1, -1, -0, -0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 9, 10, 10, 10, 10, 9, 8, 8, 7, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 3, 3, 2, 2, 1, 0, -0, -1, -2, -2, -3, -3, -5, -7, -8, -10, -11, -12, -12, -13, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -26, -27, -28, -29, -30, -31, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -41, -41, -42, -42, -43, -44, -44, -45, -46, -47, -48, -49, -50, -51, -51, -52, -52, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -52, -52, -53, -54, -56, -57, -57, -56, -55, -54, -53, -53, -53, -52, -52, -53, -53, -53, -52, -52, -53, -53, -54, -54, -54, + /* -78.0 */ -56, -56, -57, -57, -57, -57, -57, -56, -56, -56, -57, -57, -57, -56, -56, -56, -56, -56, -56, -56, -55, -54, -54, -54, -53, -53, -53, -54, -54, -54, -53, -52, -52, -52, -51, -51, -51, -50, -51, -51, -51, -51, -49, -48, -47, -46, -46, -45, -45, -44, -42, -41, -40, -40, -39, -40, -40, -39, -39, -38, -38, -37, -36, -36, -35, -35, -35, -35, -34, -34, -34, -34, -34, -34, -34, -33, -33, -32, -31, -31, -31, -30, -29, -28, -27, -26, -24, -22, -21, -20, -19, -17, -15, -13, -15, -18, -22, -24, -24, -22, -21, -20, -20, -21, -21, -21, -21, -20, -19, -19, -19, -19, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -16, -15, -16, -16, -16, -15, -14, -14, -14, -14, -15, -15, -15, -15, -15, -14, -14, -14, -13, -11, -10, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -7, -6, -6, -6, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -1, -1, -2, -3, -2, -2, -1, -0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 11, 10, 10, 9, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 2, 1, 1, -0, -1, -2, -2, -2, -2, -3, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -17, -18, -20, -22, -22, -22, -22, -23, -24, -25, -26, -27, -29, -30, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -42, -42, -42, -43, -44, -44, -45, -46, -47, -49, -50, -50, -51, -51, -52, -53, -54, -55, -55, -56, -56, -57, -57, -57, -56, -56, -56, -55, -55, -54, -53, -52, -52, -53, -54, -55, -55, -54, -53, -53, -53, -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, -55, -56, -56, + /* -77.0 */ -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -59, -59, -59, -59, -58, -57, -57, -57, -57, -56, -56, -56, -56, -55, -55, -55, -55, -54, -53, -53, -52, -51, -50, -49, -48, -47, -46, -46, -45, -44, -43, -43, -43, -42, -42, -41, -40, -39, -38, -37, -36, -36, -37, -37, -38, -37, -37, -37, -37, -36, -36, -36, -36, -35, -35, -35, -35, -35, -34, -34, -33, -32, -32, -31, -31, -30, -29, -28, -27, -26, -26, -25, -24, -23, -22, -21, -21, -20, -19, -18, -18, -18, -20, -20, -20, -18, -17, -16, -17, -19, -21, -21, -20, -19, -19, -18, -18, -18, -17, -17, -17, -17, -17, -16, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -10, -9, -7, -5, -5, -4, -3, -3, -2, -2, -2, -1, -1, -1, -2, -1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 9, 9, 10, 10, 10, 9, 8, 7, 7, 6, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 0, 0, -0, -1, -2, -3, -4, -5, -7, -8, -9, -10, -12, -14, -16, -18, -19, -19, -19, -19, -20, -20, -21, -22, -24, -26, -27, -29, -30, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -42, -42, -42, -44, -45, -45, -46, -48, -49, -50, -50, -50, -51, -52, -53, -54, -55, -56, -56, -57, -57, -58, -58, -57, -57, -57, -56, -56, -55, -55, -54, -53, -52, -53, -54, -55, -55, -55, -55, -55, -55, -55, -56, -57, -57, -56, -55, -55, -56, -56, -57, -57, -57, -58, + /* -76.0 */ -60, -60, -60, -60, -60, -60, -59, -59, -59, -59, -59, -59, -59, -59, -59, -60, -61, -62, -62, -62, -63, -63, -63, -63, -63, -63, -61, -60, -58, -57, -56, -55, -54, -54, -53, -52, -50, -49, -48, -47, -45, -44, -43, -43, -42, -41, -41, -40, -41, -41, -40, -38, -37, -36, -36, -36, -36, -36, -37, -37, -37, -36, -36, -36, -36, -35, -33, -32, -32, -32, -32, -32, -31, -30, -30, -29, -28, -28, -27, -27, -26, -26, -25, -25, -24, -23, -23, -22, -22, -22, -21, -20, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -19, -18, -18, -17, -18, -18, -17, -15, -13, -13, -13, -13, -14, -15, -15, -14, -13, -12, -12, -13, -13, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -2, -1, -1, -1, -1, -0, 1, 3, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 12, 13, 13, 13, 14, 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 10, 9, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 4, 4, 3, 0, -2, -4, -5, -5, -6, -7, -8, -9, -10, -12, -13, -15, -16, -17, -18, -18, -19, -20, -21, -23, -24, -26, -28, -29, -30, -32, -33, -35, -35, -36, -37, -37, -38, -39, -40, -41, -41, -41, -42, -43, -45, -46, -47, -49, -50, -50, -50, -50, -51, -52, -53, -54, -55, -56, -56, -57, -57, -58, -58, -58, -58, -57, -57, -56, -56, -57, -57, -56, -55, -54, -55, -57, -58, -58, -58, -57, -57, -57, -57, -58, -58, -58, -58, -57, -58, -58, -58, -59, -59, -60, + /* -75.0 */ -62, -62, -62, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -64, -64, -64, -64, -64, -64, -64, -64, -63, -63, -63, -63, -62, -62, -62, -61, -60, -58, -56, -54, -52, -51, -50, -49, -48, -47, -47, -46, -44, -44, -44, -44, -44, -43, -42, -40, -39, -39, -39, -38, -38, -37, -37, -37, -36, -36, -36, -37, -36, -35, -33, -32, -31, -30, -30, -29, -29, -28, -27, -27, -26, -26, -26, -26, -25, -25, -24, -23, -22, -21, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17, -17, -17, -16, -16, -15, -15, -16, -15, -13, -12, -10, -9, -8, -7, -6, -6, -5, -5, -6, -9, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 3, 4, 5, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 10, 9, 9, 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 16, 16, 15, 15, 15, 16, 16, 16, 15, 14, 15, 16, 16, 16, 16, 16, 16, 16, 15, 15, 16, 17, 17, 16, 15, 15, 15, 14, 14, 14, 13, 12, 12, 12, 13, 13, 13, 12, 11, 10, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 4, 2, -0, -2, -3, -4, -5, -6, -7, -8, -9, -11, -12, -14, -15, -16, -17, -18, -19, -21, -23, -25, -26, -27, -29, -30, -31, -32, -33, -34, -35, -36, -36, -37, -37, -38, -39, -41, -42, -42, -43, -43, -45, -46, -48, -48, -48, -48, -49, -50, -51, -51, -52, -53, -54, -55, -55, -56, -57, -57, -57, -58, -58, -58, -58, -58, -58, -58, -58, -59, -58, -56, -54, -54, -55, -57, -58, -58, -58, -58, -58, -59, -59, -59, -59, -59, -59, -59, -59, -60, -61, -62, + /* -74.0 */ -61, -62, -63, -63, -64, -65, -65, -65, -65, -66, -66, -65, -65, -65, -65, -65, -65, -65, -65, -65, -65, -64, -64, -64, -63, -63, -63, -63, -62, -62, -61, -61, -60, -59, -59, -58, -58, -57, -56, -55, -53, -51, -50, -49, -49, -49, -49, -47, -45, -43, -43, -43, -41, -40, -39, -39, -38, -38, -37, -37, -37, -37, -38, -38, -38, -36, -35, -33, -32, -31, -31, -30, -30, -29, -28, -28, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -19, -19, -18, -18, -18, -17, -16, -16, -16, -16, -17, -16, -16, -14, -13, -13, -13, -12, -11, -10, -8, -7, -6, -6, -5, -3, -2, -1, -1, -1, -2, -4, -6, -7, -7, -7, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -2, -1, -1, -0, -0, -1, -1, -1, -2, -2, -1, -1, -0, 1, 1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 13, 14, 14, 13, 13, 12, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 18, 18, 18, 18, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 20, 19, 18, 18, 18, 19, 19, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 17, 16, 14, 12, 12, 12, 13, 13, 13, 12, 11, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 1, -0, -2, -3, -4, -6, -7, -8, -9, -11, -12, -14, -15, -17, -18, -20, -21, -24, -26, -27, -28, -29, -29, -30, -31, -32, -33, -34, -35, -36, -36, -37, -38, -39, -40, -41, -42, -42, -42, -44, -46, -47, -46, -45, -46, -47, -49, -50, -50, -50, -51, -51, -52, -53, -55, -56, -56, -57, -57, -58, -58, -58, -58, -59, -59, -59, -58, -57, -55, -53, -50, -48, -49, -53, -56, -58, -59, -58, -59, -59, -59, -59, -59, -59, -60, -60, -60, -61, -61, + /* -73.0 */ -61, -61, -62, -63, -64, -64, -65, -65, -66, -66, -66, -66, -66, -65, -65, -65, -65, -65, -65, -65, -64, -64, -64, -64, -63, -63, -63, -62, -62, -61, -61, -60, -60, -59, -58, -58, -57, -57, -56, -55, -55, -54, -53, -52, -52, -51, -50, -50, -49, -47, -46, -45, -44, -42, -40, -40, -40, -39, -38, -38, -37, -36, -36, -35, -35, -35, -34, -34, -33, -33, -32, -32, -31, -31, -29, -28, -27, -26, -25, -25, -24, -23, -22, -22, -22, -21, -21, -21, -20, -18, -18, -18, -18, -17, -17, -17, -16, -16, -15, -15, -14, -13, -12, -11, -10, -9, -8, -7, -5, -3, -2, -1, 0, 1, 2, 3, 3, 2, -1, -3, -4, -4, -4, -5, -4, -3, -3, -2, -2, -2, -2, -1, -1, -1, -2, -2, -2, -3, -3, -4, -4, -4, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -1, 0, 1, 2, 3, 4, 6, 7, 7, 7, 7, 8, 8, 8, 9, 11, 13, 15, 15, 14, 13, 12, 13, 13, 14, 15, 16, 17, 18, 18, 19, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 19, 19, 20, 23, 23, 22, 21, 21, 21, 20, 21, 22, 22, 22, 21, 22, 22, 23, 23, 24, 23, 22, 22, 21, 21, 21, 22, 22, 21, 21, 20, 20, 19, 19, 19, 19, 19, 19, 20, 21, 21, 20, 20, 20, 20, 20, 19, 17, 14, 12, 13, 14, 15, 16, 16, 14, 13, 13, 13, 12, 11, 11, 10, 9, 8, 7, 6, 5, 5, 4, 3, 2, 0, -0, -1, -3, -5, -7, -8, -9, -11, -13, -15, -17, -18, -20, -22, -24, -27, -28, -29, -28, -29, -30, -31, -31, -32, -33, -33, -34, -35, -36, -37, -38, -39, -40, -40, -38, -39, -41, -43, -43, -43, -43, -45, -46, -48, -50, -49, -49, -49, -50, -51, -52, -53, -54, -55, -56, -57, -57, -57, -58, -58, -58, -59, -58, -58, -56, -55, -54, -52, -51, -51, -52, -55, -58, -58, -57, -57, -58, -58, -58, -58, -59, -60, -61, -61, -61, -61, + /* -72.0 */ -62, -62, -62, -62, -63, -64, -65, -66, -66, -66, -66, -65, -65, -65, -65, -65, -64, -64, -64, -64, -63, -63, -63, -63, -62, -62, -62, -61, -61, -60, -60, -59, -59, -59, -58, -57, -56, -56, -55, -54, -54, -53, -52, -52, -51, -51, -50, -49, -48, -47, -46, -45, -45, -44, -44, -43, -42, -41, -40, -39, -38, -37, -35, -34, -33, -33, -33, -33, -32, -32, -31, -31, -30, -30, -29, -28, -27, -26, -25, -24, -23, -23, -22, -21, -21, -22, -22, -22, -20, -18, -17, -17, -17, -16, -15, -15, -15, -14, -13, -13, -12, -12, -11, -10, -9, -7, -6, -4, -2, -0, 2, 2, 3, 4, 6, 7, 7, 6, 3, 1, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, 0, 1, 2, 4, 6, 7, 8, 8, 8, 9, 10, 10, 10, 12, 14, 14, 13, 13, 13, 12, 12, 13, 13, 14, 16, 17, 18, 17, 17, 16, 15, 16, 15, 15, 16, 16, 16, 17, 18, 17, 17, 18, 19, 20, 21, 23, 23, 21, 20, 21, 22, 22, 22, 22, 23, 25, 26, 26, 26, 26, 26, 25, 25, 24, 22, 21, 22, 23, 24, 24, 24, 24, 23, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 18, 16, 14, 13, 13, 13, 13, 14, 15, 15, 15, 15, 15, 14, 13, 13, 12, 11, 10, 9, 8, 6, 5, 5, 4, 3, 2, 1, -1, -3, -5, -6, -8, -9, -11, -12, -14, -16, -17, -19, -20, -22, -24, -26, -27, -27, -28, -29, -30, -31, -32, -32, -32, -32, -33, -34, -35, -36, -37, -38, -37, -37, -38, -39, -40, -40, -41, -42, -43, -45, -48, -50, -51, -51, -50, -50, -51, -52, -52, -53, -54, -55, -56, -57, -57, -57, -58, -57, -57, -57, -56, -54, -53, -55, -56, -57, -56, -55, -55, -56, -55, -53, -54, -56, -58, -58, -58, -59, -60, -61, -61, -62, -62, + /* -71.0 */ -61, -61, -62, -63, -64, -65, -65, -65, -64, -65, -66, -65, -64, -64, -64, -64, -63, -63, -63, -63, -62, -62, -62, -61, -61, -61, -61, -60, -60, -59, -59, -58, -58, -57, -57, -56, -56, -55, -54, -53, -53, -52, -51, -51, -50, -49, -48, -47, -47, -46, -45, -44, -43, -43, -42, -42, -41, -40, -40, -40, -39, -39, -38, -38, -37, -36, -36, -35, -34, -34, -33, -32, -32, -30, -28, -27, -27, -26, -25, -24, -24, -23, -22, -22, -22, -21, -20, -18, -17, -17, -16, -15, -14, -14, -14, -14, -14, -13, -12, -11, -11, -10, -10, -8, -7, -6, -4, -3, -1, 0, 3, 4, 5, 7, 10, 11, 11, 10, 8, 5, 4, 3, 2, 1, 1, -0, -1, -2, -2, -1, -1, -1, -1, -1, -1, -0, -0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 5, 7, 8, 10, 11, 11, 11, 11, 11, 11, 10, 11, 11, 11, 13, 13, 13, 12, 13, 13, 14, 14, 14, 13, 12, 12, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 18, 20, 22, 22, 22, 22, 21, 20, 20, 21, 22, 22, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 25, 25, 26, 26, 25, 24, 23, 23, 23, 23, 22, 23, 23, 22, 21, 23, 25, 25, 25, 23, 21, 18, 15, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 3, 1, -1, -2, -4, -5, -6, -7, -9, -10, -11, -13, -14, -15, -17, -18, -19, -20, -22, -24, -25, -26, -27, -27, -28, -29, -30, -31, -31, -32, -32, -33, -34, -34, -35, -35, -36, -37, -38, -39, -39, -40, -42, -43, -44, -46, -47, -48, -49, -49, -50, -51, -52, -52, -52, -53, -55, -56, -57, -57, -57, -58, -57, -57, -57, -56, -54, -55, -57, -59, -59, -60, -59, -58, -58, -58, -57, -57, -58, -59, -59, -59, -59, -60, -61, -61, -61, -61, + /* -70.0 */ -62, -62, -63, -64, -64, -64, -64, -64, -63, -63, -63, -63, -63, -63, -62, -62, -62, -62, -62, -62, -61, -61, -61, -60, -60, -60, -60, -59, -58, -58, -57, -57, -56, -56, -55, -55, -54, -54, -53, -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -45, -44, -43, -42, -41, -40, -40, -40, -40, -39, -38, -37, -36, -36, -36, -35, -35, -34, -34, -34, -33, -33, -33, -32, -32, -31, -31, -30, -29, -28, -27, -26, -26, -27, -27, -27, -25, -22, -21, -22, -22, -21, -19, -17, -15, -13, -12, -11, -10, -10, -10, -10, -9, -7, -6, -4, -4, -3, -2, 0, 2, 4, 5, 7, 10, 12, 13, 13, 11, 8, 6, 5, 4, 4, 4, 2, 1, -1, -1, -1, -0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11, 11, 10, 11, 13, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14, 14, 14, 16, 17, 17, 17, 18, 18, 17, 16, 16, 17, 19, 20, 21, 21, 21, 21, 20, 20, 21, 21, 20, 21, 22, 21, 21, 20, 19, 20, 21, 22, 23, 25, 27, 27, 26, 27, 27, 26, 27, 27, 28, 28, 28, 27, 26, 26, 26, 25, 26, 26, 25, 26, 28, 28, 26, 24, 22, 20, 17, 17, 17, 17, 17, 17, 16, 16, 16, 15, 16, 16, 15, 14, 14, 13, 12, 11, 11, 9, 8, 8, 7, 6, 4, 3, 1, -1, -2, -4, -6, -7, -9, -10, -12, -13, -14, -16, -17, -18, -18, -19, -19, -22, -24, -24, -25, -26, -27, -28, -29, -30, -30, -31, -32, -32, -33, -34, -34, -36, -37, -37, -38, -38, -39, -42, -44, -44, -43, -43, -44, -45, -46, -47, -49, -51, -51, -51, -52, -54, -55, -55, -56, -57, -56, -56, -56, -56, -55, -55, -56, -57, -57, -57, -57, -57, -58, -59, -59, -59, -59, -58, -58, -59, -59, -59, -60, -60, -61, -61, -62, + /* -69.0 */ -61, -61, -61, -62, -63, -63, -63, -63, -62, -61, -61, -60, -60, -60, -60, -59, -59, -59, -59, -59, -59, -59, -58, -59, -58, -58, -57, -57, -57, -56, -56, -55, -55, -54, -54, -53, -52, -52, -51, -51, -50, -49, -49, -48, -47, -46, -45, -45, -44, -43, -42, -42, -41, -40, -40, -39, -39, -38, -37, -36, -36, -36, -35, -35, -34, -34, -34, -33, -33, -32, -32, -31, -31, -31, -30, -29, -29, -28, -28, -27, -26, -26, -25, -25, -25, -24, -22, -21, -19, -17, -16, -16, -16, -15, -14, -14, -13, -12, -11, -9, -8, -7, -7, -6, -4, -3, -2, 0, 3, 4, 5, 6, 7, 9, 11, 12, 11, 9, 8, 7, 7, 6, 7, 7, 6, 5, 3, 3, 3, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 9, 9, 9, 9, 10, 11, 10, 10, 11, 11, 12, 13, 13, 14, 14, 14, 15, 16, 15, 15, 16, 16, 16, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 21, 23, 23, 23, 24, 24, 22, 21, 21, 21, 23, 24, 24, 25, 27, 28, 28, 28, 26, 27, 29, 31, 33, 34, 32, 30, 30, 30, 29, 28, 28, 27, 27, 28, 29, 29, 27, 25, 23, 22, 20, 19, 18, 17, 16, 16, 16, 16, 17, 17, 17, 16, 15, 14, 14, 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 5, 2, 0, -2, -5, -6, -8, -10, -11, -13, -15, -16, -17, -18, -18, -19, -19, -20, -22, -23, -24, -25, -26, -26, -27, -28, -29, -30, -30, -31, -32, -33, -35, -36, -37, -37, -37, -37, -37, -40, -43, -43, -42, -42, -43, -44, -44, -46, -47, -48, -50, -51, -51, -52, -53, -53, -54, -54, -53, -53, -53, -53, -54, -55, -55, -55, -56, -57, -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, -59, -60, -60, -60, -60, -61, -61, + /* -68.0 */ -58, -59, -60, -61, -61, -62, -61, -60, -59, -58, -58, -58, -58, -58, -57, -57, -57, -56, -56, -56, -56, -56, -56, -56, -56, -55, -55, -55, -55, -54, -54, -53, -53, -52, -52, -51, -50, -50, -49, -49, -48, -48, -47, -46, -46, -45, -44, -44, -43, -42, -41, -40, -40, -39, -38, -38, -37, -37, -36, -36, -36, -35, -35, -34, -33, -33, -32, -32, -31, -31, -30, -30, -30, -29, -29, -28, -28, -28, -27, -26, -26, -25, -24, -24, -23, -22, -22, -21, -20, -19, -18, -17, -16, -15, -14, -14, -13, -12, -11, -11, -10, -9, -8, -7, -5, -3, -1, 1, 2, 3, 5, 6, 7, 7, 8, 8, 9, 9, 9, 8, 9, 8, 9, 10, 9, 8, 7, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 16, 15, 14, 15, 15, 15, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 18, 19, 22, 23, 23, 23, 24, 25, 25, 25, 25, 25, 24, 25, 26, 26, 27, 29, 30, 32, 35, 36, 37, 38, 38, 36, 34, 34, 34, 32, 31, 30, 30, 30, 29, 28, 27, 27, 25, 24, 23, 21, 20, 19, 18, 17, 17, 17, 18, 17, 16, 15, 15, 14, 13, 13, 12, 10, 10, 11, 9, 9, 10, 9, 7, 6, 4, 2, 1, -2, -3, -5, -8, -9, -11, -12, -13, -14, -16, -17, -18, -18, -18, -18, -19, -22, -24, -25, -26, -26, -27, -28, -29, -29, -29, -30, -31, -34, -35, -36, -37, -37, -37, -37, -37, -39, -41, -41, -41, -41, -41, -43, -44, -45, -46, -48, -49, -50, -51, -52, -52, -52, -53, -53, -52, -51, -51, -51, -51, -53, -53, -54, -55, -55, -55, -55, -55, -55, -55, -55, -56, -56, -57, -57, -57, -58, -58, -59, -59, -59, -58, + /* -67.0 */ -58, -58, -59, -58, -58, -57, -56, -56, -56, -56, -56, -55, -55, -55, -55, -54, -54, -54, -54, -54, -54, -54, -53, -53, -53, -52, -52, -52, -51, -51, -51, -51, -50, -49, -49, -48, -47, -47, -46, -46, -46, -46, -45, -45, -44, -44, -43, -42, -42, -41, -40, -39, -38, -38, -37, -37, -36, -36, -36, -35, -35, -35, -34, -34, -33, -32, -32, -31, -31, -30, -29, -29, -29, -28, -28, -27, -27, -27, -26, -26, -25, -25, -24, -23, -22, -21, -21, -20, -19, -18, -17, -16, -16, -14, -13, -13, -12, -11, -10, -10, -9, -7, -6, -5, -4, -2, -1, 2, 4, 5, 6, 8, 9, 9, 9, 10, 11, 12, 12, 11, 11, 11, 12, 12, 13, 12, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 13, 13, 13, 14, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 20, 22, 22, 22, 23, 23, 23, 24, 25, 26, 26, 26, 26, 27, 29, 31, 32, 33, 34, 36, 39, 41, 41, 39, 35, 33, 32, 31, 30, 30, 29, 28, 27, 26, 26, 24, 23, 24, 25, 25, 24, 22, 20, 19, 18, 18, 18, 17, 16, 16, 16, 15, 14, 14, 12, 10, 10, 10, 9, 8, 8, 6, 4, 3, 1, -1, -1, -2, -3, -3, -6, -8, -9, -11, -12, -13, -15, -17, -18, -18, -18, -17, -18, -22, -25, -26, -27, -28, -28, -28, -29, -29, -30, -31, -32, -34, -36, -37, -37, -36, -37, -38, -39, -40, -40, -40, -40, -40, -41, -42, -43, -44, -45, -47, -48, -49, -49, -49, -49, -49, -49, -49, -49, -48, -49, -50, -50, -50, -51, -51, -51, -50, -50, -51, -52, -53, -53, -53, -54, -54, -55, -56, -56, -56, -57, -57, -57, -58, -58, + /* -66.0 */ -55, -54, -53, -53, -54, -54, -54, -54, -54, -53, -53, -53, -53, -52, -52, -52, -52, -52, -52, -52, -52, -51, -51, -50, -50, -50, -50, -50, -49, -49, -48, -48, -47, -47, -46, -45, -45, -45, -44, -43, -43, -43, -43, -43, -42, -42, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35, -35, -34, -34, -34, -33, -33, -32, -32, -32, -31, -30, -30, -29, -28, -28, -27, -27, -26, -26, -25, -25, -25, -24, -24, -23, -23, -22, -21, -20, -20, -19, -19, -17, -16, -16, -15, -14, -13, -12, -12, -11, -10, -8, -7, -7, -5, -4, -3, -2, -0, 1, 2, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 15, 15, 14, 14, 15, 16, 16, 14, 13, 13, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15, 15, 15, 15, 15, 15, 16, 16, 17, 17, 18, 19, 18, 18, 18, 17, 17, 17, 18, 18, 18, 17, 17, 18, 18, 18, 19, 19, 20, 19, 19, 22, 23, 23, 23, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 33, 34, 35, 37, 36, 34, 32, 31, 30, 28, 27, 26, 25, 25, 25, 25, 24, 24, 24, 23, 22, 21, 20, 20, 19, 18, 17, 15, 15, 15, 16, 16, 15, 14, 13, 12, 12, 10, 9, 8, 7, 5, 3, 1, 0, -0, -1, -3, -2, -1, -2, -3, -6, -8, -10, -12, -14, -14, -15, -15, -16, -18, -19, -21, -22, -23, -24, -25, -25, -26, -27, -28, -29, -30, -31, -32, -33, -35, -36, -36, -37, -37, -38, -39, -39, -40, -41, -42, -42, -42, -42, -43, -44, -45, -45, -45, -46, -46, -46, -45, -46, -47, -49, -48, -47, -47, -47, -47, -47, -48, -48, -48, -48, -49, -49, -49, -50, -51, -52, -52, -52, -53, -54, -54, -55, -55, -55, -55, -55, -55, + /* -65.0 */ -52, -51, -51, -52, -51, -51, -51, -51, -51, -51, -51, -50, -50, -50, -50, -50, -49, -49, -49, -49, -49, -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -45, -45, -44, -44, -43, -43, -42, -42, -42, -42, -42, -41, -41, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -35, -35, -34, -33, -33, -33, -32, -32, -31, -31, -31, -30, -30, -30, -29, -28, -28, -27, -26, -26, -26, -25, -25, -24, -24, -23, -23, -22, -22, -21, -20, -20, -18, -17, -17, -16, -15, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -2, -1, 0, 1, 2, 4, 5, 6, 8, 11, 13, 14, 15, 15, 16, 18, 18, 18, 18, 18, 18, 19, 19, 16, 15, 15, 14, 13, 13, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 12, 13, 12, 12, 12, 11, 11, 11, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 14, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 19, 19, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 20, 21, 23, 24, 24, 25, 26, 26, 26, 27, 28, 28, 28, 28, 29, 30, 30, 31, 30, 30, 30, 31, 31, 30, 30, 30, 29, 29, 28, 27, 27, 27, 27, 27, 26, 25, 25, 25, 24, 23, 22, 21, 20, 20, 20, 19, 18, 18, 16, 15, 14, 14, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 4, 3, 3, 1, 0, -1, -1, -2, -4, -7, -8, -9, -11, -12, -13, -15, -17, -18, -19, -19, -20, -20, -21, -22, -25, -27, -29, -31, -32, -32, -32, -33, -33, -34, -35, -35, -35, -36, -36, -37, -38, -39, -41, -42, -43, -44, -44, -44, -44, -45, -45, -45, -45, -46, -46, -46, -46, -45, -45, -44, -44, -44, -44, -44, -44, -44, -44, -44, -45, -46, -46, -47, -47, -48, -49, -49, -50, -51, -51, -52, -52, -52, -52, -52, -52, -52, -52, + /* -64.0 */ -51, -51, -50, -50, -50, -50, -50, -49, -49, -49, -48, -48, -48, -48, -47, -47, -47, -47, -47, -46, -46, -45, -45, -45, -45, -45, -44, -43, -43, -43, -43, -42, -42, -42, -42, -41, -41, -40, -40, -40, -40, -39, -39, -39, -39, -39, -38, -38, -37, -37, -36, -36, -35, -35, -34, -33, -33, -32, -32, -31, -31, -31, -30, -30, -29, -29, -29, -28, -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -23, -22, -21, -21, -20, -19, -18, -17, -17, -16, -15, -14, -13, -13, -12, -12, -11, -10, -9, -8, -6, -5, -4, -3, -1, 0, 1, 2, 3, 4, 6, 7, 8, 10, 11, 14, 16, 17, 18, 18, 19, 21, 21, 21, 21, 22, 22, 20, 18, 17, 15, 15, 16, 16, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 13, 13, 14, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 23, 24, 25, 26, 27, 27, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 29, 29, 28, 28, 27, 27, 27, 26, 26, 26, 25, 24, 23, 23, 22, 22, 22, 21, 20, 19, 18, 16, 15, 15, 14, 13, 12, 11, 10, 8, 7, 5, 4, 3, 3, 2, 2, 0, 0, -0, -2, -4, -8, -9, -10, -11, -12, -13, -16, -18, -19, -20, -21, -22, -22, -22, -23, -25, -27, -28, -30, -31, -32, -33, -34, -35, -36, -37, -37, -38, -39, -40, -40, -41, -41, -41, -41, -41, -41, -41, -41, -42, -43, -44, -44, -43, -43, -42, -42, -42, -42, -42, -42, -41, -41, -41, -41, -41, -41, -41, -41, -42, -43, -43, -44, -45, -45, -46, -47, -47, -48, -48, -48, -48, -49, -50, -50, -50, -51, -51, -51, + /* -63.0 */ -50, -50, -49, -49, -49, -49, -48, -48, -47, -47, -47, -46, -46, -45, -45, -45, -44, -44, -44, -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -39, -38, -38, -38, -38, -38, -37, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34, -33, -33, -33, -32, -32, -31, -30, -30, -30, -29, -29, -28, -28, -28, -27, -27, -26, -26, -26, -25, -25, -24, -24, -23, -23, -22, -22, -21, -21, -20, -20, -19, -18, -17, -17, -16, -15, -14, -13, -13, -12, -12, -11, -10, -10, -8, -7, -6, -5, -4, -3, -1, 0, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 14, 15, 15, 17, 19, 21, 22, 23, 24, 24, 23, 22, 22, 21, 20, 20, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 14, 14, 14, 15, 16, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 25, 24, 25, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31, 30, 30, 31, 31, 30, 29, 29, 29, 29, 29, 29, 30, 30, 30, 31, 30, 30, 30, 29, 29, 29, 28, 27, 27, 26, 26, 26, 25, 25, 24, 24, 24, 23, 22, 21, 20, 18, 18, 18, 17, 16, 14, 13, 12, 10, 8, 7, 6, 4, 3, 2, 0, -1, -2, -3, -4, -6, -7, -8, -9, -10, -12, -13, -13, -15, -16, -18, -20, -21, -22, -23, -23, -24, -25, -27, -28, -29, -30, -31, -32, -32, -33, -34, -34, -35, -36, -37, -38, -39, -39, -40, -40, -40, -41, -41, -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -39, -39, -39, -38, -38, -37, -38, -38, -37, -38, -38, -39, -40, -40, -41, -42, -42, -43, -43, -44, -44, -45, -46, -47, -49, -49, -50, -50, -50, -50, -50, -50, + /* -62.0 */ -49, -49, -49, -48, -48, -48, -47, -47, -46, -46, -45, -45, -44, -44, -43, -43, -42, -42, -42, -41, -41, -40, -40, -40, -39, -39, -38, -38, -38, -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31, -30, -30, -30, -29, -29, -28, -27, -27, -27, -26, -26, -26, -26, -25, -25, -25, -24, -24, -23, -23, -22, -22, -21, -21, -21, -20, -19, -19, -18, -17, -16, -16, -15, -15, -14, -13, -12, -12, -11, -10, -10, -9, -8, -7, -6, -5, -3, -2, -1, 1, 2, 3, 4, 6, 7, 8, 10, 12, 13, 14, 15, 15, 14, 14, 15, 18, 21, 22, 22, 22, 23, 23, 22, 21, 20, 20, 20, 20, 21, 22, 23, 22, 22, 21, 19, 19, 19, 20, 20, 20, 20, 19, 20, 19, 20, 19, 19, 19, 19, 18, 18, 18, 17, 16, 16, 16, 15, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 28, 29, 30, 30, 31, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 30, 30, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 29, 28, 28, 28, 28, 27, 27, 26, 26, 25, 25, 24, 23, 22, 22, 22, 21, 21, 20, 19, 17, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -0, -1, -2, -3, -5, -6, -7, -8, -9, -9, -10, -11, -13, -14, -15, -16, -18, -19, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -32, -33, -34, -34, -35, -35, -36, -36, -36, -37, -37, -38, -38, -38, -39, -39, -38, -37, -37, -37, -37, -37, -36, -36, -36, -36, -35, -35, -34, -35, -35, -35, -35, -35, -36, -37, -37, -38, -39, -39, -40, -41, -42, -43, -45, -47, -48, -48, -48, -48, -49, -49, -49, -49, -49, -49, + /* -61.0 */ -48, -47, -47, -47, -47, -46, -46, -45, -45, -45, -44, -43, -43, -43, -42, -42, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -36, -35, -35, -35, -35, -34, -34, -34, -34, -34, -34, -33, -33, -33, -33, -32, -32, -32, -32, -32, -31, -30, -30, -30, -29, -29, -28, -28, -28, -29, -28, -27, -27, -26, -26, -25, -25, -25, -25, -25, -24, -24, -24, -24, -24, -23, -22, -22, -21, -21, -21, -20, -20, -19, -18, -18, -17, -17, -16, -15, -15, -14, -14, -13, -12, -12, -11, -10, -9, -8, -8, -7, -6, -5, -4, -3, -2, -0, 1, 2, 3, 5, 7, 8, 9, 11, 12, 14, 15, 17, 17, 18, 18, 18, 17, 16, 15, 16, 21, 23, 24, 24, 22, 21, 21, 21, 21, 23, 25, 26, 26, 24, 21, 18, 20, 20, 21, 22, 21, 22, 22, 22, 22, 22, 22, 22, 21, 19, 17, 17, 17, 16, 17, 18, 18, 18, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 27, 28, 28, 28, 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 31, 31, 31, 30, 30, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 21, 19, 17, 14, 12, 11, 9, 8, 6, 5, 3, 2, 1, 0, -1, -2, -4, -5, -6, -7, -8, -8, -9, -10, -11, -13, -14, -15, -16, -17, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -30, -31, -31, -32, -33, -33, -34, -34, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -34, -34, -34, -34, -33, -33, -33, -33, -32, -31, -32, -32, -33, -33, -33, -33, -34, -35, -36, -37, -38, -39, -40, -41, -43, -45, -45, -46, -46, -47, -47, -48, -48, -48, -48, -48, -48, -48, + /* -60.0 */ -46, -46, -46, -45, -45, -45, -44, -44, -44, -43, -43, -43, -42, -41, -41, -40, -40, -39, -39, -38, -37, -37, -36, -35, -35, -34, -34, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -31, -30, -30, -30, -30, -30, -29, -29, -29, -28, -28, -27, -27, -27, -27, -26, -26, -25, -25, -24, -24, -24, -24, -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -22, -21, -21, -20, -20, -20, -19, -18, -18, -17, -16, -16, -15, -14, -14, -14, -13, -12, -12, -11, -10, -9, -9, -8, -7, -7, -6, -5, -4, -4, -2, -1, 0, 1, 2, 4, 6, 7, 8, 9, 12, 13, 15, 16, 17, 17, 18, 18, 19, 20, 21, 21, 20, 20, 20, 21, 21, 21, 20, 20, 19, 18, 19, 17, 16, 16, 18, 20, 21, 22, 21, 20, 21, 22, 23, 23, 23, 24, 24, 24, 23, 22, 18, 13, 10, 13, 18, 20, 20, 21, 21, 21, 21, 20, 19, 18, 18, 18, 17, 17, 16, 16, 16, 16, 15, 15, 15, 16, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 28, 28, 29, 29, 29, 29, 29, 30, 31, 32, 32, 32, 33, 33, 34, 34, 34, 35, 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 33, 33, 33, 32, 32, 31, 31, 31, 31, 31, 31, 30, 29, 29, 28, 27, 27, 27, 28, 27, 26, 26, 25, 25, 24, 22, 21, 17, 14, 12, 11, 10, 9, 8, 7, 5, 4, 3, 2, 0, -1, -2, -3, -4, -5, -7, -7, -8, -9, -10, -11, -12, -14, -15, -16, -17, -18, -20, -21, -22, -23, -24, -25, -26, -26, -27, -28, -28, -29, -30, -30, -31, -31, -32, -32, -33, -33, -33, -33, -33, -33, -33, -33, -33, -32, -32, -31, -31, -31, -30, -30, -30, -30, -29, -29, -30, -31, -31, -31, -31, -31, -33, -35, -36, -37, -38, -39, -40, -41, -42, -43, -44, -44, -45, -46, -46, -46, -47, -47, -47, -47, -46, -46, + /* -59.0 */ -45, -44, -44, -44, -44, -43, -43, -43, -42, -42, -41, -41, -41, -40, -39, -39, -38, -37, -37, -36, -35, -35, -34, -33, -33, -32, -32, -31, -31, -30, -30, -30, -30, -29, -29, -29, -29, -29, -28, -28, -28, -28, -27, -27, -27, -27, -27, -27, -26, -25, -25, -24, -24, -23, -23, -23, -23, -22, -22, -22, -21, -21, -21, -21, -21, -22, -22, -22, -22, -21, -20, -20, -19, -20, -19, -18, -17, -17, -16, -16, -16, -15, -14, -14, -13, -12, -12, -12, -11, -11, -10, -9, -9, -8, -7, -6, -6, -5, -4, -3, -2, -2, -1, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 15, 16, 17, 17, 18, 19, 20, 19, 19, 20, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 20, 20, 19, 20, 20, 21, 20, 21, 21, 22, 22, 23, 23, 24, 24, 24, 23, 22, 20, 15, 9, 15, 18, 20, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 18, 18, 18, 19, 19, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 36, 36, 36, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 33, 32, 31, 32, 32, 32, 32, 31, 30, 30, 29, 29, 30, 30, 30, 29, 29, 27, 26, 25, 24, 23, 19, 16, 14, 13, 12, 12, 10, 9, 8, 7, 6, 5, 3, 2, 0, -1, -2, -3, -4, -6, -7, -8, -8, -9, -11, -12, -13, -14, -15, -16, -18, -19, -20, -21, -22, -23, -24, -24, -25, -26, -27, -27, -28, -29, -29, -30, -30, -30, -30, -30, -31, -31, -31, -31, -31, -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -28, -29, -29, -29, -30, -34, -34, -33, -34, -36, -37, -38, -39, -40, -41, -41, -42, -43, -44, -44, -45, -45, -45, -45, -45, -45, -45, -45, + /* -58.0 */ -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40, -39, -38, -38, -37, -37, -36, -35, -34, -34, -33, -33, -32, -31, -31, -30, -30, -29, -29, -28, -28, -28, -27, -27, -27, -27, -27, -27, -26, -26, -26, -26, -26, -25, -25, -25, -24, -23, -23, -23, -22, -22, -21, -21, -21, -21, -21, -20, -20, -20, -20, -20, -19, -20, -20, -20, -19, -19, -19, -19, -19, -18, -18, -17, -17, -17, -16, -16, -15, -15, -14, -14, -13, -13, -12, -11, -11, -11, -10, -9, -8, -8, -8, -7, -6, -6, -5, -4, -3, -2, -1, -0, 1, 1, 3, 4, 5, 7, 8, 10, 11, 13, 13, 15, 15, 16, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 19, 19, 20, 20, 20, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22, 20, 15, 10, 15, 18, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 28, 27, 28, 28, 29, 29, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 37, 37, 37, 37, 38, 38, 37, 37, 37, 36, 36, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 34, 33, 32, 31, 32, 31, 31, 30, 30, 30, 30, 30, 30, 30, 29, 28, 28, 26, 25, 23, 21, 18, 16, 15, 15, 14, 13, 12, 10, 9, 8, 7, 6, 4, 3, 1, -0, -1, -2, -4, -5, -6, -7, -8, -9, -10, -11, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -24, -25, -26, -26, -27, -27, -28, -28, -28, -29, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26, -26, -26, -26, -26, -26, -26, -26, -27, -27, -28, -28, -32, -32, -28, -31, -32, -34, -35, -36, -37, -38, -39, -39, -41, -41, -42, -42, -42, -42, -42, -42, -43, -43, -43, -43, + /* -57.0 */ -40, -40, -40, -40, -39, -39, -39, -39, -39, -38, -37, -37, -36, -36, -35, -35, -34, -33, -33, -32, -31, -31, -30, -30, -29, -28, -28, -27, -27, -27, -26, -26, -26, -25, -25, -25, -25, -25, -25, -24, -23, -23, -22, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -20, -19, -19, -18, -18, -19, -19, -19, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -15, -15, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -9, -9, -9, -8, -7, -7, -6, -5, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 12, 14, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 19, 18, 19, 19, 18, 18, 18, 19, 19, 18, 19, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 23, 23, 23, 23, 22, 20, 16, 8, 9, 16, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 24, 23, 23, 23, 23, 22, 22, 22, 22, 21, 20, 20, 19, 20, 20, 20, 20, 21, 22, 23, 25, 25, 26, 27, 28, 28, 29, 29, 29, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 37, 37, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 35, 34, 34, 34, 32, 31, 31, 30, 29, 29, 28, 26, 23, 20, 19, 18, 17, 16, 16, 15, 13, 12, 11, 10, 9, 8, 6, 5, 4, 2, 1, -1, -2, -3, -4, -5, -7, -8, -9, -10, -11, -12, -14, -15, -16, -17, -18, -19, -20, -21, -22, -22, -23, -24, -24, -25, -26, -26, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -25, -25, -25, -24, -24, -24, -24, -24, -24, -24, -25, -25, -25, -26, -26, -30, -30, -27, -30, -29, -31, -33, -34, -35, -36, -36, -37, -38, -38, -39, -39, -40, -40, -40, -40, -40, -40, -40, -40, + /* -56.0 */ -37, -37, -38, -37, -37, -37, -37, -36, -36, -35, -35, -34, -34, -33, -33, -32, -32, -31, -30, -30, -30, -29, -28, -27, -27, -27, -26, -26, -25, -25, -24, -24, -24, -24, -23, -23, -23, -23, -22, -21, -21, -20, -20, -20, -20, -20, -20, -20, -20, -19, -19, -19, -18, -19, -18, -17, -17, -16, -15, -15, -14, -14, -14, -14, -14, -14, -14, -15, -14, -14, -14, -15, -14, -14, -14, -14, -14, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -10, -9, -9, -8, -7, -7, -6, -5, -4, -3, -2, -2, -1, 1, 2, 3, 4, 5, 5, 5, 5, 4, 6, 11, 14, 15, 16, 14, 13, 14, 15, 16, 17, 18, 18, 19, 18, 17, 18, 18, 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 17, 18, 18, 19, 19, 19, 19, 20, 21, 21, 21, 21, 21, 21, 21, 17, 5, 5, 15, 19, 20, 20, 21, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 26, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 23, 22, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 31, 31, 31, 32, 31, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 41, 41, 41, 42, 41, 41, 41, 41, 41, 41, 40, 40, 39, 39, 39, 38, 38, 37, 37, 37, 36, 36, 35, 35, 35, 35, 36, 36, 35, 34, 34, 33, 33, 33, 33, 32, 31, 31, 30, 29, 27, 24, 22, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 10, 9, 8, 7, 5, 4, 3, 1, 0, -1, -2, -4, -5, -6, -7, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -20, -21, -21, -22, -23, -23, -24, -25, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -25, -24, -23, -23, -23, -22, -22, -22, -23, -23, -23, -23, -24, -24, -24, -24, -25, -25, -26, -27, -28, -28, -29, -31, -32, -32, -31, -32, -33, -34, -35, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, + /* -55.0 */ -34, -35, -35, -35, -35, -34, -34, -34, -33, -33, -32, -32, -31, -31, -31, -30, -30, -30, -29, -28, -27, -27, -26, -26, -25, -25, -24, -24, -24, -23, -23, -23, -23, -23, -23, -22, -21, -21, -20, -20, -20, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -17, -16, -16, -15, -15, -14, -14, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -10, -8, -7, -6, -5, -5, -5, -4, -3, -3, -2, -1, 1, 2, 3, 4, 5, 5, 3, 3, 7, 10, 11, 13, 14, 14, 14, 14, 12, 11, 12, 13, 15, 17, 17, 18, 18, 17, 15, 14, 14, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 17, 19, 21, 23, 21, 17, 11, 12, 10, 8, 7, 4, 3, 8, 15, 18, 20, 21, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 25, 25, 24, 24, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 34, 33, 33, 34, 34, 35, 35, 36, 37, 38, 39, 40, 41, 43, 44, 44, 45, 45, 44, 44, 44, 44, 44, 43, 42, 41, 41, 41, 41, 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 35, 35, 34, 35, 35, 35, 35, 34, 34, 34, 33, 33, 32, 30, 28, 25, 23, 21, 20, 19, 19, 18, 17, 15, 14, 13, 12, 10, 9, 8, 7, 5, 4, 2, 2, 0, -1, -2, -3, -5, -6, -7, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -20, -20, -21, -22, -22, -23, -24, -24, -25, -25, -25, -25, -25, -25, -25, -25, -24, -25, -24, -24, -24, -24, -23, -23, -22, -22, -21, -21, -21, -21, -21, -22, -22, -22, -22, -22, -22, -22, -23, -23, -23, -22, -23, -26, -26, -27, -27, -28, -27, -26, -25, -26, -28, -30, -32, -33, -34, -34, -33, -33, -33, -34, -34, -34, + /* -54.0 */ -31, -32, -32, -31, -31, -31, -31, -31, -31, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -23, -23, -23, -23, -22, -21, -21, -21, -20, -20, -20, -19, -19, -18, -18, -18, -18, -17, -17, -18, -19, -19, -18, -18, -17, -16, -15, -15, -14, -14, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -12, -12, -12, -12, -12, -11, -10, -10, -9, -9, -9, -9, -9, -8, -7, -6, -6, -5, -5, -4, -4, -3, -2, -1, 0, 2, 3, 4, 5, 5, 4, 4, 9, 12, 10, 9, 10, 12, 12, 12, 12, 11, 10, 9, 10, 11, 10, 10, 10, 9, 7, 7, 9, 12, 13, 12, 11, 11, 12, 14, 14, 14, 13, 14, 16, 16, 15, 17, 18, 18, 17, 12, 12, 13, 13, 13, 14, 14, 13, 14, 15, 17, 19, 21, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 27, 27, 27, 27, 28, 28, 27, 27, 26, 26, 27, 27, 28, 28, 28, 29, 29, 31, 31, 32, 33, 34, 35, 36, 36, 36, 37, 34, 35, 36, 36, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 47, 47, 47, 46, 45, 45, 44, 45, 43, 43, 44, 45, 43, 41, 41, 40, 39, 38, 38, 38, 37, 36, 36, 35, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 33, 31, 27, 24, 23, 24, 22, 20, 20, 18, 17, 16, 14, 13, 12, 11, 9, 8, 7, 6, 4, 3, 1, 0, -1, -2, -4, -5, -6, -7, -9, -10, -11, -12, -14, -15, -16, -17, -18, -19, -20, -20, -21, -22, -22, -23, -23, -24, -24, -25, -24, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -21, -20, -20, -20, -20, -19, -21, -21, -21, -21, -21, -21, -21, -21, -22, -22, -22, -22, -19, -23, -22, -23, -23, -24, -22, -22, -22, -22, -23, -24, -24, -26, -28, -29, -30, -30, -31, -31, -31, -31, + /* -53.0 */ -28, -28, -29, -28, -29, -29, -28, -28, -28, -28, -27, -27, -26, -26, -26, -26, -25, -25, -25, -24, -24, -23, -23, -22, -22, -23, -23, -22, -21, -21, -21, -20, -20, -20, -20, -19, -19, -19, -18, -18, -18, -18, -18, -19, -20, -20, -20, -19, -18, -17, -17, -16, -16, -15, -14, -14, -13, -13, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -10, -10, -9, -9, -8, -8, -8, -8, -8, -7, -6, -6, -5, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 5, 5, 9, 11, 10, 10, 9, 9, 11, 12, 12, 12, 13, 13, 12, 12, 11, 11, 11, 10, 10, 8, 6, 5, 5, 6, 7, 6, 4, 6, 8, 6, 4, 4, 6, 6, 4, 3, 3, 5, 10, 11, 12, 13, 15, 15, 16, 16, 16, 16, 16, 16, 17, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 26, 26, 26, 27, 27, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 36, 37, 38, 38, 38, 37, 36, 37, 37, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 48, 48, 51, 50, 47, 46, 47, 45, 44, 45, 43, 43, 42, 41, 41, 41, 39, 38, 37, 37, 36, 35, 35, 35, 35, 35, 35, 34, 34, 35, 37, 40, 39, 37, 35, 34, 32, 30, 28, 26, 24, 23, 22, 20, 19, 17, 16, 15, 13, 12, 11, 9, 8, 7, 5, 4, 3, 1, -0, -1, -3, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -21, -22, -23, -23, -24, -24, -24, -24, -24, -23, -23, -23, -23, -23, -22, -22, -22, -22, -21, -21, -20, -20, -19, -19, -19, -19, -19, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -17, -19, -19, -20, -21, -20, -19, -19, -19, -18, -18, -19, -20, -21, -23, -26, -27, -27, -28, -28, -28, + /* -52.0 */ -25, -25, -25, -26, -26, -26, -26, -25, -25, -24, -24, -24, -24, -24, -23, -23, -23, -23, -22, -22, -21, -21, -21, -22, -22, -21, -20, -20, -20, -20, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -19, -20, -19, -19, -19, -19, -18, -18, -17, -17, -16, -15, -15, -14, -13, -13, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -9, -9, -8, -8, -8, -7, -7, -7, -6, -5, -5, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 5, 5, 7, 13, 13, 13, 11, 10, 9, 10, 10, 10, 11, 12, 13, 14, 14, 14, 12, 12, 12, 12, 11, 10, 9, 8, 7, 6, 6, 6, 5, 4, 4, 5, 5, 5, 5, 5, 6, 7, 8, 10, 11, 10, 13, 15, 15, 15, 16, 15, 15, 15, 18, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 29, 30, 31, 31, 33, 33, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 38, 37, 36, 39, 39, 38, 39, 40, 41, 43, 44, 45, 46, 47, 49, 49, 47, 47, 47, 47, 47, 46, 45, 44, 44, 43, 43, 43, 42, 42, 41, 40, 39, 38, 37, 37, 36, 36, 36, 35, 35, 35, 34, 35, 37, 38, 38, 38, 37, 36, 33, 30, 29, 28, 27, 25, 23, 22, 21, 19, 18, 16, 15, 14, 12, 11, 9, 8, 6, 5, 4, 2, 1, -1, -2, -3, -5, -6, -7, -8, -10, -11, -12, -13, -14, -16, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -23, -24, -24, -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -15, -16, -17, -17, -18, -18, -15, -16, -16, -15, -16, -16, -17, -17, -19, -21, -23, -24, -24, -24, -25, + /* -51.0 */ -21, -21, -21, -21, -22, -23, -23, -22, -22, -21, -21, -21, -21, -21, -21, -21, -21, -21, -20, -20, -20, -20, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -18, -18, -17, -17, -18, -19, -18, -18, -18, -18, -18, -18, -18, -18, -17, -16, -15, -15, -14, -13, -13, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -8, -8, -8, -7, -7, -7, -6, -6, -5, -4, -4, -3, -2, -1, -0, 1, 2, 2, 3, 5, 5, 5, 5, 9, 14, 15, 15, 13, 11, 10, 10, 10, 10, 11, 12, 13, 13, 12, 12, 13, 13, 13, 12, 11, 10, 10, 9, 7, 6, 6, 6, 6, 5, 6, 6, 8, 9, 8, 7, 6, 6, 7, 7, 8, 8, 10, 10, 11, 12, 12, 13, 13, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 27, 27, 27, 27, 27, 26, 26, 25, 25, 25, 25, 25, 25, 26, 26, 27, 27, 27, 29, 31, 31, 32, 32, 33, 34, 34, 34, 35, 35, 36, 36, 37, 37, 38, 36, 38, 40, 40, 39, 40, 41, 42, 43, 44, 46, 46, 46, 47, 46, 47, 46, 46, 46, 45, 45, 44, 44, 44, 44, 43, 43, 41, 41, 40, 39, 38, 38, 37, 37, 36, 36, 37, 37, 36, 35, 38, 39, 38, 38, 37, 36, 33, 31, 30, 29, 28, 27, 25, 24, 22, 20, 19, 18, 16, 15, 13, 12, 11, 9, 8, 6, 5, 3, 2, 0, -1, -3, -4, -5, -7, -8, -9, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -21, -22, -23, -23, -23, -24, -24, -24, -23, -23, -23, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -19, -18, -18, -18, -17, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -16, -15, -14, -12, -12, -14, -14, -11, -12, -12, -12, -13, -13, -14, -14, -15, -16, -18, -20, -20, -21, -21, + /* -50.0 */ -17, -17, -17, -15, -17, -19, -20, -19, -19, -19, -19, -19, -19, -19, -19, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -17, -17, -16, -16, -16, -16, -16, -17, -17, -16, -17, -18, -18, -18, -17, -17, -17, -18, -18, -18, -18, -17, -17, -17, -16, -15, -14, -14, -13, -12, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -1, -0, 0, 1, 2, 3, 4, 5, 6, 5, 6, 10, 13, 16, 16, 14, 13, 11, 10, 10, 11, 11, 11, 12, 13, 13, 13, 12, 12, 11, 11, 9, 8, 6, 4, 3, 3, 2, 2, 2, 2, 2, 3, 5, 6, 6, 6, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 25, 25, 26, 26, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 25, 25, 25, 25, 24, 25, 25, 24, 25, 24, 25, 25, 26, 26, 27, 28, 30, 31, 31, 32, 33, 33, 34, 34, 35, 35, 35, 36, 37, 37, 38, 38, 40, 40, 40, 41, 41, 42, 43, 43, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 44, 44, 44, 43, 43, 42, 41, 40, 39, 38, 37, 37, 36, 39, 40, 39, 37, 39, 41, 40, 37, 37, 36, 35, 33, 32, 31, 30, 29, 27, 26, 24, 23, 22, 20, 19, 17, 16, 14, 13, 11, 10, 9, 7, 6, 4, 2, 1, -1, -2, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -23, -23, -23, -24, -24, -24, -24, -23, -23, -23, -22, -22, -22, -21, -20, -20, -19, -19, -18, -18, -19, -18, -18, -17, -17, -17, -18, -18, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -16, -15, -14, -13, -13, -11, -10, -12, -10, -9, -10, -10, -10, -10, -10, -10, -11, -12, -13, -13, -14, -15, -17, + /* -49.0 */ -10, -12, -14, -15, -16, -16, -16, -16, -17, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -17, -16, -16, -15, -15, -15, -15, -15, -15, -16, -16, -15, -16, -16, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -16, -16, -15, -15, -14, -13, -13, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -7, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -1, -1, 0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 10, 15, 16, 17, 16, 15, 13, 12, 12, 11, 11, 11, 11, 12, 11, 11, 11, 10, 10, 9, 7, 6, 3, 1, -0, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 1, 1, 2, 3, 3, 4, 4, 6, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 19, 20, 21, 21, 23, 23, 24, 25, 26, 27, 27, 27, 28, 27, 27, 26, 26, 25, 25, 25, 24, 24, 24, 24, 23, 24, 24, 25, 24, 24, 25, 23, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 33, 33, 33, 34, 34, 34, 35, 35, 37, 38, 39, 40, 42, 42, 42, 42, 43, 43, 42, 43, 44, 44, 45, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 44, 44, 43, 42, 41, 41, 40, 39, 38, 38, 38, 37, 37, 38, 39, 41, 41, 40, 38, 36, 34, 33, 32, 31, 30, 29, 28, 26, 25, 24, 22, 21, 20, 18, 17, 15, 14, 12, 11, 9, 8, 6, 5, 3, 2, 0, -2, -3, -5, -6, -8, -9, -10, -12, -13, -14, -15, -17, -18, -19, -19, -20, -21, -22, -22, -23, -23, -23, -24, -24, -24, -24, -24, -24, -24, -23, -23, -22, -22, -21, -21, -20, -20, -19, -18, -18, -17, -18, -18, -17, -17, -17, -17, -17, -17, -16, -16, -14, -15, -16, -16, -16, -16, -16, -15, -15, -14, -12, -12, -11, -10, -11, -8, -9, -6, -7, -8, -8, -8, -7, -7, -7, -7, -8, -9, -9, -9, -10, + /* -48.0 */ -5, -8, -11, -12, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -14, -13, -14, -14, -14, -14, -14, -15, -15, -16, -16, -16, -16, -17, -17, -17, -17, -17, -17, -17, -16, -16, -15, -15, -15, -14, -14, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -3, -2, -2, -1, -1, -0, 1, 2, 2, 3, 4, 5, 6, 7, 7, 7, 11, 15, 16, 17, 18, 16, 15, 14, 12, 11, 11, 11, 11, 11, 11, 11, 10, 8, 7, 5, 4, 2, 1, -0, -1, -2, -2, -2, -3, -3, -3, -2, -1, -1, -1, -1, -0, -0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 10, 11, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 28, 27, 27, 26, 25, 25, 24, 24, 24, 24, 23, 23, 23, 22, 23, 23, 24, 24, 26, 25, 26, 26, 26, 27, 28, 29, 30, 30, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 35, 37, 39, 40, 41, 44, 44, 44, 43, 43, 43, 43, 44, 44, 44, 43, 44, 44, 45, 45, 45, 45, 45, 45, 45, 44, 44, 43, 43, 42, 41, 40, 38, 38, 37, 36, 36, 36, 39, 39, 40, 40, 39, 37, 35, 33, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 20, 19, 17, 16, 15, 13, 11, 10, 8, 7, 5, 4, 2, 1, -1, -3, -4, -6, -7, -9, -10, -12, -13, -14, -16, -17, -18, -19, -20, -21, -22, -22, -23, -24, -24, -24, -24, -25, -25, -25, -25, -25, -24, -24, -24, -23, -23, -22, -22, -21, -20, -20, -19, -18, -18, -17, -18, -17, -17, -17, -16, -16, -16, -15, -14, -14, -14, -15, -15, -15, -15, -15, -15, -14, -14, -13, -11, -10, -9, -8, -11, -10, -6, -3, -4, -5, -5, -6, -5, -5, -5, -5, -6, -5, -5, -4, -5, + /* -47.0 */ -5, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -14, -14, -14, -14, -15, -15, -15, -16, -16, -17, -17, -17, -16, -16, -16, -16, -16, -15, -15, -14, -14, -14, -13, -13, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -7, -7, -7, -6, -6, -6, -5, -5, -4, -3, -2, -1, -0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 13, 18, 20, 20, 17, 16, 14, 13, 12, 12, 12, 11, 12, 11, 11, 9, 7, 6, 4, 2, 0, -1, -1, -2, -3, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1, 0, 2, 3, 4, 6, 7, 9, 11, 12, 14, 15, 16, 17, 19, 20, 21, 23, 23, 25, 26, 26, 27, 28, 27, 27, 27, 27, 27, 25, 25, 24, 24, 24, 23, 23, 23, 22, 22, 22, 22, 23, 24, 25, 26, 25, 26, 26, 26, 27, 27, 28, 29, 30, 31, 31, 32, 32, 33, 33, 33, 33, 33, 34, 34, 35, 37, 40, 41, 43, 45, 45, 45, 44, 46, 43, 45, 44, 43, 43, 44, 45, 46, 46, 45, 45, 46, 48, 48, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 34, 36, 38, 37, 36, 36, 35, 33, 32, 31, 30, 29, 28, 26, 25, 24, 23, 22, 20, 19, 18, 16, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -1, -2, -4, -6, -7, -9, -10, -12, -13, -15, -16, -17, -19, -20, -21, -21, -22, -23, -24, -25, -25, -25, -25, -25, -26, -26, -26, -25, -25, -25, -25, -24, -24, -23, -23, -22, -21, -20, -20, -19, -18, -17, -17, -18, -17, -17, -17, -16, -16, -15, -13, -12, -13, -14, -14, -14, -14, -13, -13, -13, -12, -12, -11, -11, -9, -7, -7, -7, -8, -4, -2, 1, 1, -1, -2, -2, -2, -2, -3, -3, -3, -3, -4, -5, + /* -46.0 */ -2, -3, -4, -4, -4, -5, -5, -6, -7, -8, -9, -9, -10, -10, -10, -10, -11, -10, -10, -10, -10, -10, -10, -10, -9, -10, -10, -11, -11, -12, -12, -13, -13, -14, -14, -14, -15, -15, -15, -16, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -13, -13, -13, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -6, -6, -6, -5, -5, -4, -4, -3, -3, -2, -1, -0, 0, 1, 2, 2, 4, 5, 5, 7, 8, 9, 10, 11, 11, 15, 18, 23, 23, 19, 16, 15, 14, 13, 12, 12, 12, 12, 11, 10, 9, 5, 4, 2, 0, -0, -1, -2, -3, -3, -4, -4, -4, -4, -4, -3, -4, -4, -5, -5, -4, -4, -3, -3, -2, -1, 0, 2, 3, 5, 7, 9, 10, 12, 13, 15, 16, 17, 19, 20, 22, 23, 24, 25, 26, 27, 27, 27, 26, 27, 26, 25, 25, 25, 24, 23, 23, 23, 23, 23, 22, 22, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 35, 38, 40, 42, 45, 45, 46, 46, 46, 45, 46, 45, 46, 46, 44, 46, 47, 47, 45, 47, 52, 50, 47, 44, 43, 43, 42, 41, 40, 38, 37, 35, 34, 34, 33, 33, 33, 34, 34, 33, 33, 32, 31, 30, 29, 29, 28, 27, 25, 24, 23, 22, 20, 19, 18, 17, 15, 14, 12, 11, 9, 7, 6, 4, 2, 1, -1, -3, -4, -6, -7, -9, -11, -12, -14, -15, -16, -18, -19, -21, -21, -22, -23, -24, -25, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -25, -25, -24, -24, -23, -22, -22, -21, -20, -19, -18, -18, -17, -18, -17, -16, -16, -16, -15, -14, -14, -14, -14, -14, -13, -13, -12, -12, -11, -11, -10, -10, -9, -8, -8, -7, -5, -5, -5, -2, 4, 4, 5, 6, 3, 1, 1, 1, 1, 1, 0, -0, -1, -2, + /* -45.0 */ 3, 3, 3, 3, 1, -0, -1, -3, -4, -5, -6, -7, -8, -8, -8, -9, -8, -8, -8, -8, -8, -8, -7, -8, -8, -8, -9, -10, -10, -11, -12, -12, -12, -13, -13, -13, -14, -14, -15, -15, -15, -15, -15, -16, -16, -15, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -4, -3, -3, -2, -2, -1, -0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 9, 10, 11, 11, 13, 16, 19, 19, 18, 17, 16, 15, 14, 12, 12, 12, 11, 11, 11, 9, 5, 3, 2, 0, 0, -0, -1, -2, -3, -3, -3, -4, -4, -4, -3, -4, -4, -5, -5, -5, -4, -4, -3, -3, -2, -0, 1, 3, 5, 7, 9, 10, 12, 13, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 24, 24, 23, 22, 21, 21, 21, 21, 22, 22, 22, 23, 24, 25, 26, 26, 26, 27, 27, 28, 28, 29, 30, 31, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 35, 38, 39, 42, 44, 46, 46, 47, 46, 46, 46, 46, 45, 45, 46, 46, 46, 45, 44, 45, 45, 44, 43, 43, 42, 41, 40, 39, 37, 36, 34, 33, 32, 32, 32, 31, 31, 31, 31, 31, 30, 30, 29, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 16, 15, 14, 12, 11, 9, 8, 6, 4, 3, 1, -1, -3, -5, -6, -8, -9, -11, -13, -14, -16, -17, -19, -20, -21, -22, -23, -24, -25, -26, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, -26, -26, -26, -25, -24, -24, -23, -22, -21, -20, -19, -19, -18, -17, -17, -17, -16, -16, -15, -15, -14, -13, -13, -12, -12, -12, -11, -11, -10, -9, -9, -8, -8, -8, -7, -6, -4, -3, -3, -3, -6, -1, 4, 5, 8, 7, 6, 5, 5, 6, 5, 5, 5, 4, 3, + /* -44.0 */ 10, 10, 9, 10, 9, 6, 3, 1, -0, -2, -4, -4, -5, -5, -6, -6, -6, -5, -6, -4, -6, -7, -7, -7, -7, -7, -8, -9, -9, -10, -10, -11, -11, -12, -12, -12, -13, -14, -14, -14, -15, -15, -15, -15, -14, -15, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, -2, -2, -1, -0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 12, 14, 17, 18, 18, 19, 18, 16, 15, 14, 12, 11, 11, 11, 11, 10, 6, 6, 2, 1, 1, -0, -1, -2, -2, -2, -3, -3, -3, -3, -4, -5, -5, -6, -6, -6, -6, -5, -4, -3, -2, -0, 1, 3, 5, 7, 8, 10, 12, 13, 15, 16, 18, 19, 21, 22, 23, 24, 25, 26, 25, 26, 26, 26, 25, 25, 25, 24, 24, 23, 23, 22, 22, 23, 22, 21, 21, 21, 21, 21, 22, 23, 24, 24, 25, 26, 27, 27, 28, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 33, 34, 34, 33, 33, 33, 34, 34, 35, 38, 40, 42, 44, 45, 46, 46, 46, 46, 44, 44, 44, 45, 44, 44, 44, 44, 44, 43, 43, 43, 42, 41, 39, 39, 37, 36, 34, 33, 32, 32, 31, 31, 30, 30, 30, 30, 29, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 16, 15, 13, 12, 11, 9, 8, 6, 4, 3, 1, -1, -3, -5, -6, -8, -10, -12, -13, -14, -16, -18, -19, -21, -22, -23, -24, -25, -26, -27, -28, -28, -29, -29, -29, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26, -26, -25, -24, -23, -23, -22, -21, -20, -19, -18, -17, -17, -16, -16, -15, -15, -13, -10, -8, -9, -11, -9, -9, -9, -9, -8, -7, -7, -6, -6, -6, -5, -4, -3, -1, -1, 0, 1, -0, 2, 5, 8, 9, 9, 11, 10, 11, 12, 11, 11, 10, 10, + /* -43.0 */ 14, 13, 12, 12, 10, 9, 7, 4, 3, 2, 0, -1, -2, -2, -3, -3, -3, -3, -3, -4, -4, -4, -5, -5, -6, -6, -7, -7, -8, -9, -9, -10, -11, -11, -12, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -8, -7, -6, -5, -5, -5, -4, -4, -3, -2, -2, -1, -0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 12, 15, 17, 20, 20, 20, 20, 19, 16, 14, 13, 13, 12, 11, 12, 11, 9, 6, 4, 1, 1, 0, -1, -2, -2, -2, -3, -3, -3, -4, -4, -5, -6, -7, -7, -7, -6, -6, -5, -3, -2, -1, 1, 3, 5, 7, 8, 10, 11, 13, 14, 16, 18, 19, 20, 22, 23, 24, 25, 25, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 22, 21, 22, 21, 19, 19, 20, 21, 21, 21, 22, 23, 24, 25, 25, 26, 28, 28, 28, 28, 28, 29, 29, 30, 30, 31, 32, 33, 33, 33, 34, 34, 33, 34, 34, 33, 33, 34, 35, 37, 40, 41, 43, 43, 44, 45, 45, 44, 43, 44, 44, 43, 43, 44, 44, 43, 43, 42, 42, 41, 39, 38, 37, 36, 35, 33, 32, 32, 31, 30, 30, 30, 29, 29, 28, 27, 27, 26, 25, 24, 24, 23, 22, 21, 20, 19, 18, 16, 15, 13, 12, 11, 9, 8, 6, 4, 3, 1, -1, -3, -5, -7, -8, -11, -12, -14, -16, -17, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -29, -30, -30, -30, -30, -30, -30, -30, -30, -30, -29, -29, -28, -28, -27, -27, -26, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -16, -15, -15, -14, -9, -5, -4, -5, -8, -9, -8, -8, -7, -6, -5, -5, -4, -4, -3, -3, -2, -0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 13, 12, 10, 12, 14, 14, 15, 14, 14, + /* -42.0 */ 15, 15, 14, 13, 11, 10, 9, 7, 5, 4, 3, 2, 1, 0, 0, -1, 0, -0, -2, -2, -2, -3, -4, -4, -4, -5, -5, -6, -7, -7, -8, -9, -10, -11, -11, -12, -12, -12, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -5, -5, -4, -4, -3, -2, -2, -1, -0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 16, 17, 20, 21, 22, 23, 23, 19, 16, 14, 13, 13, 12, 12, 12, 12, 10, 6, 2, 1, 0, -1, -1, -2, -3, -3, -3, -4, -4, -5, -6, -7, -8, -8, -7, -6, -5, -4, -3, -2, -1, 1, 3, 5, 6, 8, 10, 11, 13, 14, 16, 18, 19, 20, 22, 23, 24, 25, 25, 25, 25, 25, 24, 24, 24, 24, 23, 23, 22, 22, 21, 20, 20, 20, 24, 21, 22, 20, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 29, 29, 29, 29, 30, 30, 31, 31, 32, 34, 35, 35, 35, 34, 34, 33, 33, 33, 34, 35, 37, 38, 40, 41, 42, 43, 44, 44, 43, 44, 44, 43, 43, 43, 43, 42, 42, 40, 40, 39, 37, 36, 35, 35, 33, 32, 31, 30, 30, 29, 28, 28, 28, 28, 27, 26, 25, 24, 23, 22, 22, 21, 20, 19, 18, 17, 16, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -1, -3, -5, -7, -9, -11, -13, -14, -16, -18, -19, -21, -22, -24, -25, -26, -27, -28, -29, -30, -31, -31, -31, -32, -32, -31, -31, -31, -31, -31, -31, -30, -30, -29, -29, -28, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -15, -14, -12, -6, -2, -1, -2, -5, -7, -7, -6, -5, -4, -3, -2, -2, -1, -1, -0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 15, 15, 11, 9, 10, 11, 14, 16, 15, + /* -41.0 */ 19, 18, 17, 15, 13, 12, 10, 7, 6, 5, 4, 4, 3, 2, 2, 4, 2, 0, 0, -1, -1, -1, -1, -1, -2, -3, -4, -4, -5, -6, -7, -8, -10, -10, -11, -11, -11, -11, -12, -12, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -8, -8, -8, -8, -7, -7, -5, -4, -4, -3, -3, -2, -2, -1, -1, -0, -0, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 11, 11, 16, 19, 21, 22, 23, 24, 23, 20, 16, 14, 14, 13, 13, 13, 13, 12, 11, 9, 5, 2, 1, -0, -1, -2, -3, -3, -4, -5, -5, -6, -7, -8, -8, -8, -7, -6, -5, -4, -3, -2, -1, 0, 2, 4, 6, 8, 10, 11, 13, 14, 16, 18, 19, 20, 21, 22, 23, 24, 25, 24, 24, 24, 24, 24, 23, 23, 23, 22, 22, 20, 20, 20, 19, 18, 17, 18, 18, 19, 19, 20, 21, 22, 23, 25, 26, 27, 27, 27, 29, 29, 29, 29, 29, 29, 30, 30, 30, 31, 33, 35, 36, 35, 35, 33, 33, 33, 33, 33, 33, 35, 36, 37, 38, 39, 40, 42, 43, 43, 43, 44, 43, 43, 42, 42, 41, 41, 40, 39, 37, 36, 35, 34, 32, 31, 30, 29, 29, 28, 28, 27, 27, 27, 26, 26, 25, 24, 22, 21, 20, 19, 19, 18, 18, 16, 15, 14, 13, 11, 10, 8, 7, 5, 4, 2, 0, -2, -4, -5, -7, -9, -11, -13, -15, -17, -19, -20, -22, -23, -24, -26, -27, -28, -29, -30, -31, -32, -32, -33, -33, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -30, -30, -29, -28, -28, -27, -26, -25, -23, -22, -21, -20, -18, -17, -16, -16, -15, -14, -12, -6, -2, -1, -1, -0, -3, -5, -4, -3, -2, -1, -1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 16, 18, 16, 13, 13, 17, 16, 15, 17, 19, + /* -40.0 */ 21, 20, 19, 17, 15, 13, 11, 9, 8, 7, 6, 6, 5, 5, 6, 3, 3, 3, 2, 1, 1, 1, 0, -0, -1, -2, -2, -3, -4, -6, -7, -8, -9, -10, -10, -10, -10, -11, -11, -12, -12, -12, -12, -12, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -3, -3, -2, -2, -1, -1, -1, -0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 11, 10, 13, 17, 22, 23, 23, 23, 21, 19, 16, 15, 14, 13, 13, 14, 14, 13, 13, 12, 10, 5, 2, 0, -0, -2, -3, -4, -4, -5, -6, -6, -7, -7, -8, -7, -7, -6, -5, -4, -3, -2, -1, 0, 2, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 23, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 20, 19, 18, 18, 18, 17, 18, 18, 19, 19, 20, 20, 21, 22, 24, 25, 26, 26, 27, 26, 28, 28, 29, 29, 29, 29, 29, 30, 30, 32, 34, 35, 35, 34, 33, 33, 33, 34, 34, 33, 33, 34, 34, 35, 37, 38, 40, 41, 42, 43, 43, 43, 42, 42, 41, 40, 40, 39, 38, 36, 35, 33, 32, 31, 30, 29, 28, 27, 27, 27, 26, 26, 26, 25, 24, 23, 22, 21, 20, 18, 18, 17, 17, 16, 15, 13, 12, 10, 9, 7, 6, 4, 2, 1, -1, -2, -4, -6, -8, -10, -12, -14, -16, -18, -19, -21, -23, -24, -25, -27, -28, -29, -30, -31, -32, -33, -33, -34, -34, -34, -34, -34, -34, -34, -34, -34, -33, -33, -32, -32, -31, -30, -30, -29, -28, -27, -26, -25, -24, -23, -21, -20, -18, -17, -15, -15, -14, -12, -7, -2, -2, -1, -0, 1, 0, -2, -2, -1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 10, 12, 12, 15, 18, 19, 19, 19, 20, 19, 15, 13, 16, 18, 19, 19, 21, + /* -39.0 */ 22, 22, 21, 19, 17, 16, 13, 12, 11, 10, 9, 8, 10, 8, 6, 6, 5, 4, 3, 3, 3, 2, 1, 1, 0, -1, -2, -3, -4, -6, -7, -8, -8, -9, -9, -9, -10, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -3, -3, -2, -2, -2, -1, -1, -1, -0, 1, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 9, 13, 17, 20, 24, 23, 20, 18, 17, 16, 14, 14, 14, 14, 13, 12, 13, 13, 13, 11, 8, 3, 1, -0, -2, -3, -4, -4, -5, -5, -6, -7, -7, -7, -7, -7, -6, -6, -5, -4, -3, -1, 1, 2, 4, 6, 8, 10, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 20, 20, 19, 19, 18, 17, 17, 17, 17, 18, 19, 19, 20, 20, 21, 22, 23, 24, 25, 26, 26, 28, 27, 28, 27, 28, 29, 29, 29, 30, 30, 30, 32, 34, 33, 32, 33, 32, 32, 32, 32, 32, 32, 32, 32, 33, 34, 36, 37, 39, 40, 40, 41, 41, 43, 42, 41, 40, 40, 38, 37, 35, 33, 31, 30, 29, 28, 27, 26, 26, 26, 26, 25, 25, 25, 24, 23, 22, 20, 19, 18, 17, 16, 16, 15, 15, 13, 11, 9, 8, 6, 5, 3, 2, 0, -2, -3, -5, -7, -9, -11, -12, -14, -16, -18, -20, -22, -23, -25, -27, -28, -29, -30, -31, -32, -33, -33, -34, -34, -35, -35, -35, -35, -35, -35, -35, -35, -35, -34, -34, -33, -33, -32, -31, -30, -29, -29, -28, -27, -26, -24, -23, -22, -20, -18, -16, -15, -13, -10, -6, -3, -1, 1, 2, 2, 3, 1, -1, 0, 2, 3, 4, 5, 5, 6, 7, 7, 7, 8, 9, 11, 13, 16, 16, 18, 21, 22, 22, 22, 22, 24, 23, 25, 25, 20, 21, 20, 22, + /* -38.0 */ 21, 23, 23, 22, 20, 18, 16, 14, 13, 13, 11, 12, 12, 9, 8, 7, 6, 5, 4, 4, 4, 3, 2, 1, -0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -8, -9, -10, -10, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -13, -13, -12, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -6, -5, -4, -4, -3, -3, -2, -2, -2, -2, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 9, 14, 20, 21, 24, 24, 21, 19, 18, 16, 16, 15, 16, 15, 14, 15, 15, 15, 13, 11, 9, 4, 2, 1, -1, -2, -3, -4, -5, -5, -6, -6, -7, -7, -7, -7, -7, -6, -5, -4, -3, -1, 1, 2, 4, 6, 8, 9, 11, 13, 14, 15, 16, 18, 19, 20, 20, 21, 22, 22, 22, 22, 22, 21, 21, 21, 21, 20, 20, 19, 19, 17, 16, 16, 16, 17, 17, 18, 19, 19, 20, 21, 22, 23, 23, 23, 24, 25, 26, 26, 27, 27, 27, 27, 27, 28, 29, 29, 29, 29, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 30, 30, 31, 32, 34, 35, 36, 37, 38, 39, 39, 41, 41, 41, 41, 39, 37, 36, 34, 32, 31, 29, 27, 26, 26, 25, 25, 25, 25, 24, 24, 23, 22, 21, 20, 19, 17, 16, 15, 14, 14, 13, 14, 12, 9, 7, 6, 4, 3, 1, -0, -2, -4, -6, -8, -10, -11, -13, -15, -17, -19, -21, -22, -24, -26, -27, -29, -30, -31, -32, -33, -34, -34, -34, -35, -35, -36, -36, -36, -37, -36, -37, -36, -36, -35, -35, -35, -34, -33, -33, -32, -31, -30, -29, -28, -27, -26, -24, -22, -21, -19, -17, -15, -12, -8, -4, -1, 2, 3, 4, 7, 7, 6, 7, 6, 2, 4, 5, 6, 7, 8, 9, 9, 9, 10, 11, 12, 13, 17, 18, 19, 21, 24, 25, 25, 24, 25, 26, 28, 30, 29, 26, 22, 21, 21, + /* -37.0 */ 20, 21, 23, 23, 22, 20, 18, 17, 15, 15, 14, 13, 12, 11, 10, 8, 7, 6, 6, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -5, -6, -6, -7, -7, -8, -8, -9, -10, -10, -10, -10, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -12, -12, -12, -12, -12, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, 0, 1, 2, 3, 5, 6, 7, 8, 9, 11, 11, 9, 12, 21, 21, 25, 25, 23, 20, 18, 17, 17, 17, 17, 16, 17, 17, 16, 15, 14, 12, 10, 8, 4, 2, -0, -2, -3, -4, -5, -5, -6, -6, -7, -7, -7, -7, -7, -6, -5, -4, -2, -1, 1, 2, 4, 6, 7, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 18, 18, 18, 17, 16, 16, 17, 17, 18, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 29, 29, 29, 29, 28, 30, 30, 30, 29, 30, 29, 30, 30, 31, 31, 30, 29, 28, 29, 30, 31, 31, 32, 34, 36, 37, 37, 37, 38, 39, 39, 38, 36, 36, 33, 31, 30, 28, 26, 25, 25, 24, 24, 24, 24, 23, 23, 22, 21, 19, 18, 17, 16, 15, 14, 13, 12, 12, 11, 10, 8, 5, 4, 2, 0, -1, -3, -5, -7, -8, -10, -12, -14, -16, -17, -19, -21, -23, -25, -26, -28, -29, -31, -32, -33, -34, -35, -36, -37, -37, -38, -39, -39, -39, -39, -39, -38, -39, -39, -38, -38, -37, -36, -35, -35, -34, -33, -32, -30, -29, -28, -27, -26, -25, -23, -21, -18, -13, -9, -6, -4, -1, 2, 4, 5, 7, 9, 12, 14, 14, 12, 6, 7, 8, 9, 10, 12, 11, 12, 12, 13, 14, 16, 17, 19, 21, 22, 24, 25, 26, 27, 27, 28, 29, 32, 33, 33, 30, 23, 21, 20, + /* -36.0 */ 23, 17, 22, 24, 24, 23, 21, 19, 18, 16, 16, 14, 14, 12, 11, 9, 9, 7, 6, 5, 4, 3, 2, 1, -0, -1, -2, -3, -3, -4, -4, -5, -6, -7, -7, -8, -9, -9, -9, -10, -10, -10, -10, -11, -11, -12, -11, -11, -11, -11, -11, -12, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -3, -3, -3, -2, -2, -1, -0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 11, 9, 19, 21, 25, 27, 26, 23, 20, 19, 18, 18, 18, 18, 17, 17, 17, 17, 15, 13, 11, 9, 7, 4, 1, -1, -3, -5, -5, -6, -6, -6, -7, -7, -7, -7, -7, -6, -5, -4, -3, -1, 1, 2, 4, 6, 7, 9, 10, 12, 13, 14, 16, 17, 18, 18, 19, 20, 20, 20, 20, 19, 19, 18, 18, 18, 18, 18, 17, 17, 17, 18, 17, 17, 17, 17, 18, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 29, 31, 31, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, 30, 30, 30, 29, 27, 27, 27, 27, 28, 28, 30, 32, 34, 35, 35, 34, 34, 34, 35, 34, 34, 33, 33, 31, 29, 27, 25, 24, 24, 24, 24, 24, 23, 23, 22, 20, 19, 18, 17, 15, 14, 13, 12, 11, 11, 10, 9, 8, 6, 4, 1, -0, -2, -3, -5, -7, -9, -11, -12, -14, -16, -18, -20, -22, -24, -25, -27, -28, -30, -31, -33, -33, -36, -37, -38, -39, -39, -40, -40, -40, -41, -41, -40, -39, -38, -38, -38, -38, -39, -38, -37, -36, -36, -35, -34, -33, -31, -30, -29, -28, -26, -24, -21, -18, -11, -7, -5, -3, -1, 1, 3, 5, 6, 8, 10, 12, 16, 19, 17, 10, 9, 10, 12, 13, 14, 14, 15, 15, 16, 18, 19, 20, 22, 24, 25, 25, 27, 28, 29, 29, 31, 33, 36, 37, 36, 34, 33, 28, 23, + /* -35.0 */ 28, 18, 20, 25, 26, 25, 23, 21, 20, 19, 17, 16, 14, 13, 12, 10, 9, 8, 6, 5, 5, 3, 2, 1, 0, -0, -1, -2, -3, -3, -4, -5, -6, -6, -7, -8, -8, -9, -9, -9, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -7, -7, -6, -6, -6, -6, -6, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -0, 1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 13, 10, 12, 21, 25, 30, 26, 22, 21, 20, 20, 19, 18, 18, 17, 17, 17, 16, 15, 14, 13, 10, 9, 8, 3, -0, -3, -5, -6, -6, -6, -7, -7, -8, -7, -7, -7, -6, -5, -4, -3, -1, 0, 2, 5, 7, 6, 8, 9, 11, 12, 14, 15, 16, 16, 17, 18, 18, 18, 19, 19, 18, 18, 18, 17, 17, 17, 17, 17, 17, 18, 17, 17, 17, 18, 18, 18, 19, 20, 20, 20, 21, 21, 22, 23, 24, 25, 25, 26, 26, 26, 26, 28, 30, 31, 32, 31, 30, 29, 29, 26, 27, 28, 27, 26, 26, 27, 28, 30, 30, 29, 27, 25, 25, 25, 26, 26, 27, 30, 33, 33, 33, 32, 31, 31, 31, 31, 30, 31, 30, 30, 29, 26, 25, 23, 22, 22, 22, 22, 22, 21, 20, 19, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 4, 2, -1, -2, -4, -6, -7, -9, -11, -13, -15, -17, -18, -20, -22, -24, -26, -28, -29, -30, -32, -33, -34, -37, -38, -40, -40, -40, -40, -40, -39, -38, -39, -40, -38, -35, -33, -32, -32, -34, -35, -35, -34, -33, -33, -33, -33, -33, -32, -31, -28, -25, -22, -19, -15, -11, -7, -4, -2, -0, 1, 2, 4, 6, 8, 10, 12, 14, 17, 20, 20, 17, 11, 13, 14, 15, 16, 17, 17, 17, 19, 21, 22, 24, 25, 26, 26, 27, 28, 31, 32, 32, 34, 38, 39, 38, 38, 38, 38, 37, 28, + /* -34.0 */ 37, 24, 18, 25, 27, 27, 26, 23, 21, 20, 17, 16, 16, 14, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -0, -2, -2, -3, -3, -4, -4, -5, -6, -7, -8, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -12, -12, -12, -12, -11, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -2, -1, -1, 0, 1, 2, 3, 5, 7, 7, 10, 10, 11, 12, 14, 13, 8, 19, 25, 32, 24, 22, 22, 23, 22, 21, 19, 18, 17, 17, 17, 17, 16, 16, 15, 13, 10, 8, 6, 2, -1, -3, -5, -6, -6, -7, -7, -8, -7, -7, -7, -6, -5, -4, -3, -1, 1, 3, 3, 5, 6, 7, 9, 9, 11, 12, 13, 14, 15, 16, 16, 17, 18, 18, 18, 18, 17, 17, 16, 16, 16, 16, 16, 16, 17, 18, 17, 18, 19, 18, 20, 20, 20, 21, 21, 21, 22, 23, 23, 24, 25, 25, 26, 26, 26, 27, 29, 31, 32, 33, 33, 32, 31, 30, 28, 27, 29, 28, 26, 26, 26, 27, 29, 29, 29, 26, 23, 23, 23, 23, 24, 25, 28, 31, 33, 31, 30, 28, 28, 28, 27, 27, 27, 28, 29, 27, 25, 24, 22, 21, 20, 20, 20, 20, 19, 18, 17, 16, 15, 14, 12, 11, 10, 9, 8, 7, 6, 5, 3, 1, -1, -2, -4, -6, -8, -9, -11, -13, -15, -17, -19, -21, -22, -24, -26, -28, -30, -31, -32, -33, -35, -37, -38, -40, -41, -41, -40, -40, -40, -37, -36, -37, -38, -36, -33, -31, -28, -28, -30, -30, -30, -30, -29, -27, -26, -27, -28, -28, -27, -24, -22, -18, -14, -11, -8, -4, -2, 1, 3, 4, 4, 6, 8, 10, 12, 14, 17, 19, 22, 24, 22, 18, 15, 17, 18, 19, 19, 20, 20, 23, 24, 26, 27, 27, 27, 28, 30, 32, 32, 33, 36, 39, 39, 39, 39, 40, 40, 41, 41, 37, + /* -33.0 */ 43, 35, 18, 24, 28, 28, 27, 24, 23, 20, 19, 18, 16, 14, 12, 11, 10, 9, 8, 7, 6, 5, 3, 2, 1, 1, -0, -1, -2, -2, -3, -4, -4, -5, -6, -7, -8, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -3, -2, -2, -2, -1, -1, -0, 0, 1, 3, 4, 5, 6, 6, 8, 9, 11, 12, 14, 15, 10, 15, 26, 32, 23, 21, 23, 25, 25, 23, 20, 19, 18, 17, 18, 17, 17, 16, 15, 13, 11, 8, 7, 4, -0, -3, -4, -5, -6, -7, -8, -8, -8, -8, -7, -6, -5, -3, -2, -1, 1, 2, 3, 4, 6, 7, 7, 8, 9, 11, 12, 13, 14, 14, 15, 16, 16, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 17, 17, 19, 19, 19, 20, 20, 23, 21, 22, 22, 22, 23, 23, 24, 24, 25, 26, 27, 27, 27, 28, 31, 31, 33, 34, 34, 32, 31, 29, 28, 29, 29, 30, 29, 25, 25, 25, 26, 27, 29, 26, 22, 20, 21, 21, 22, 23, 26, 31, 30, 28, 26, 25, 25, 24, 24, 23, 23, 24, 25, 25, 24, 22, 21, 19, 19, 18, 18, 17, 17, 16, 15, 14, 13, 12, 11, 9, 8, 7, 6, 5, 4, 3, 1, -1, -3, -5, -7, -8, -10, -11, -12, -15, -17, -19, -21, -23, -25, -27, -28, -30, -32, -33, -34, -35, -37, -39, -39, -40, -41, -40, -40, -41, -40, -38, -38, -39, -38, -36, -33, -30, -27, -27, -28, -28, -28, -28, -27, -26, -23, -22, -21, -21, -21, -19, -17, -15, -14, -11, -7, -2, 1, 3, 7, 7, 8, 8, 9, 12, 14, 17, 19, 22, 25, 27, 26, 25, 20, 19, 21, 24, 22, 24, 24, 27, 28, 29, 30, 29, 30, 30, 34, 34, 35, 36, 37, 38, 40, 40, 40, 41, 42, 42, 43, 43, + /* -32.0 */ 44, 41, 23, 20, 28, 30, 29, 25, 24, 21, 20, 19, 17, 15, 13, 12, 11, 10, 8, 7, 6, 4, 3, 2, 1, 1, 0, -0, -2, -2, -3, -3, -4, -5, -6, -7, -8, -9, -9, -10, -10, -10, -10, -11, -11, -12, -12, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -4, -3, -2, -2, -1, -1, -1, -0, 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 15, 16, 12, 15, 29, 32, 26, 21, 24, 25, 27, 25, 22, 20, 18, 17, 17, 17, 16, 15, 14, 13, 11, 8, 6, 5, -1, -3, -4, -5, -6, -8, -8, -7, -8, -7, -7, -6, -5, -2, -1, 0, 1, 2, 3, 4, 6, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 16, 17, 18, 19, 19, 19, 20, 20, 23, 21, 23, 23, 23, 23, 24, 24, 25, 25, 27, 27, 28, 29, 31, 30, 32, 33, 35, 37, 36, 35, 34, 34, 33, 33, 31, 31, 27, 24, 23, 23, 24, 25, 24, 20, 18, 18, 19, 20, 21, 24, 26, 26, 25, 23, 23, 21, 21, 20, 20, 20, 20, 21, 22, 21, 21, 21, 19, 16, 16, 15, 15, 14, 14, 13, 12, 11, 10, 9, 8, 6, 5, 4, 3, 2, 0, -2, -4, -6, -7, -9, -11, -13, -14, -15, -16, -19, -21, -23, -25, -26, -28, -30, -29, -31, -32, -34, -35, -36, -37, -40, -40, -41, -40, -41, -41, -40, -39, -39, -39, -38, -36, -35, -31, -27, -27, -26, -25, -26, -26, -24, -24, -22, -20, -19, -20, -19, -18, -15, -12, -12, -9, -4, 0, 2, 4, 9, 10, 12, 13, 12, 13, 16, 20, 22, 24, 26, 28, 30, 29, 27, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 31, 32, 32, 36, 37, 37, 39, 40, 41, 42, 42, 42, 42, 43, 43, 44, 44, + /* -31.0 */ 46, 45, 33, 19, 28, 31, 29, 28, 26, 23, 21, 19, 17, 16, 14, 12, 11, 10, 8, 7, 6, 4, 3, 2, 1, 1, -0, -1, -1, -2, -2, -3, -3, -5, -6, -7, -8, -8, -9, -9, -9, -9, -10, -11, -11, -12, -12, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -8, -7, -7, -7, -6, -6, -6, -5, -5, -5, -4, -4, -3, -2, -2, -1, -0, -0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 16, 13, 17, 31, 33, 27, 24, 25, 25, 27, 26, 22, 20, 18, 17, 17, 16, 15, 15, 14, 13, 11, 8, 6, 4, 1, -3, -5, -6, -8, -8, -8, -8, -9, -8, -7, -5, -4, -1, 1, 3, 3, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 15, 15, 15, 15, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 22, 24, 23, 23, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 31, 31, 32, 33, 35, 35, 35, 35, 35, 34, 35, 36, 36, 32, 30, 25, 22, 22, 22, 22, 22, 17, 16, 16, 16, 16, 18, 20, 22, 22, 22, 21, 19, 18, 17, 17, 17, 17, 18, 18, 18, 18, 19, 18, 18, 15, 14, 13, 13, 13, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, -0, -2, -4, -6, -8, -10, -12, -13, -15, -17, -17, -18, -21, -23, -25, -27, -28, -28, -30, -32, -34, -34, -36, -37, -37, -39, -39, -39, -40, -40, -40, -40, -40, -40, -39, -38, -37, -36, -31, -30, -26, -25, -25, -24, -24, -23, -24, -21, -20, -20, -19, -20, -18, -16, -13, -9, -7, -6, -2, 1, 4, 7, 11, 10, 14, 16, 16, 17, 18, 22, 24, 25, 27, 30, 32, 33, 31, 25, 26, 29, 28, 29, 31, 32, 33, 33, 34, 34, 34, 35, 37, 39, 40, 41, 42, 43, 45, 43, 43, 43, 44, 44, 45, 46, + /* -30.0 */ 48, 46, 40, 26, 25, 31, 31, 30, 27, 25, 23, 21, 19, 16, 15, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 1, -0, -1, -2, -2, -1, -2, -4, -5, -6, -6, -7, -7, -8, -8, -9, -9, -10, -11, -11, -12, -13, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -8, -7, -7, -7, -6, -6, -6, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 7, 8, 9, 10, 12, 13, 15, 16, 14, 15, 33, 37, 32, 27, 25, 24, 24, 26, 23, 21, 19, 18, 17, 15, 14, 13, 11, 10, 9, 6, 4, 3, 3, 1, -4, -6, -7, -8, -8, -9, -10, -9, -7, -6, -4, -1, -0, 0, 1, 1, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 17, 17, 18, 19, 20, 21, 23, 23, 25, 22, 23, 24, 24, 25, 26, 26, 26, 27, 28, 29, 32, 31, 32, 34, 35, 34, 33, 33, 33, 33, 32, 34, 33, 36, 35, 30, 28, 24, 21, 21, 20, 20, 16, 14, 13, 14, 14, 15, 15, 18, 19, 19, 18, 16, 15, 14, 14, 14, 15, 15, 15, 14, 14, 14, 15, 15, 14, 13, 12, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 1, 0, -1, -3, -5, -7, -9, -11, -13, -15, -16, -18, -19, -20, -21, -23, -25, -27, -30, -31, -31, -32, -33, -35, -36, -37, -38, -38, -38, -39, -39, -39, -40, -39, -40, -40, -40, -39, -37, -36, -33, -29, -27, -24, -24, -22, -23, -22, -22, -21, -20, -18, -18, -17, -18, -17, -14, -10, -6, -4, -1, 0, 3, 6, 8, 12, 13, 15, 18, 19, 21, 22, 24, 26, 28, 28, 32, 34, 36, 35, 30, 29, 29, 30, 32, 33, 33, 35, 36, 36, 36, 36, 37, 39, 42, 43, 44, 45, 45, 46, 45, 45, 45, 45, 45, 46, 48, + /* -29.0 */ 48, 47, 46, 35, 23, 30, 31, 31, 28, 26, 23, 21, 19, 17, 15, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 0, -0, -1, -2, -2, -2, -3, -4, -5, -5, -5, -6, -7, -7, -8, -8, -10, -11, -12, -12, -13, -13, -13, -14, -13, -13, -13, -13, -12, -12, -11, -11, -11, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -1, -0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 17, 16, 14, 31, 38, 35, 31, 28, 26, 26, 24, 24, 22, 20, 19, 17, 16, 14, 11, 10, 9, 8, 7, 6, 4, 2, 1, -3, -6, -8, -9, -9, -9, -9, -9, -8, -8, -6, -4, -3, -1, 0, 1, 2, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 14, 15, 15, 15, 15, 15, 16, 17, 18, 18, 19, 20, 21, 22, 24, 24, 23, 24, 24, 24, 25, 25, 26, 26, 27, 28, 30, 32, 31, 32, 32, 32, 31, 31, 32, 32, 31, 31, 31, 31, 34, 35, 29, 27, 25, 19, 18, 18, 18, 13, 12, 11, 11, 12, 12, 11, 13, 15, 15, 15, 15, 13, 11, 10, 10, 11, 11, 11, 10, 10, 10, 11, 11, 10, 11, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, -1, -2, -4, -6, -8, -10, -12, -14, -15, -17, -19, -20, -22, -23, -25, -27, -29, -31, -33, -33, -33, -34, -36, -37, -36, -37, -38, -39, -38, -38, -38, -39, -39, -39, -39, -40, -39, -38, -36, -34, -28, -26, -23, -23, -21, -21, -20, -20, -18, -17, -17, -16, -16, -16, -16, -15, -12, -9, -4, -1, 2, 4, 5, 8, 10, 12, 14, 16, 19, 20, 23, 25, 26, 28, 30, 31, 33, 35, 37, 37, 34, 31, 33, 32, 34, 35, 35, 37, 38, 39, 38, 38, 40, 41, 46, 45, 46, 47, 47, 47, 47, 46, 47, 47, 46, 46, 48, + /* -28.0 */ 48, 49, 48, 41, 25, 30, 35, 32, 30, 27, 24, 22, 19, 17, 15, 13, 12, 10, 9, 7, 6, 5, 4, 2, 1, 0, -0, -1, -1, -1, -2, -3, -4, -4, -5, -5, -4, -5, -6, -8, -9, -11, -11, -12, -13, -13, -13, -14, -14, -13, -13, -13, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -1, -1, -0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 17, 17, 13, 26, 35, 38, 35, 29, 29, 27, 24, 24, 23, 21, 20, 18, 16, 14, 11, 9, 8, 8, 7, 6, 6, 2, 1, -2, -6, -8, -10, -10, -11, -11, -11, -10, -9, -7, -6, -4, -3, -2, -1, -0, -0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14, 14, 14, 15, 15, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 25, 24, 24, 25, 25, 25, 25, 26, 26, 27, 28, 30, 32, 32, 32, 32, 32, 30, 31, 31, 33, 31, 30, 30, 30, 32, 32, 28, 26, 24, 19, 18, 17, 15, 12, 10, 8, 9, 10, 10, 9, 8, 12, 12, 12, 12, 11, 8, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 8, 9, 8, 8, 7, 7, 6, 4, 3, 2, 1, -0, -2, -3, -5, -7, -9, -11, -13, -15, -17, -19, -20, -22, -23, -24, -26, -28, -30, -31, -34, -35, -35, -36, -37, -38, -38, -37, -38, -39, -39, -38, -38, -38, -39, -39, -39, -39, -39, -38, -37, -34, -29, -24, -21, -20, -20, -20, -19, -18, -16, -15, -14, -14, -14, -13, -12, -12, -12, -10, -9, -6, 0, 4, 5, 8, 9, 11, 13, 15, 18, 20, 22, 25, 27, 29, 30, 32, 33, 35, 38, 40, 40, 38, 35, 36, 35, 36, 36, 38, 39, 41, 41, 41, 40, 42, 44, 46, 47, 47, 48, 48, 49, 49, 48, 48, 47, 47, 47, 48, + /* -27.0 */ 48, 50, 49, 45, 29, 31, 34, 33, 31, 28, 25, 22, 19, 17, 15, 13, 12, 10, 9, 7, 7, 5, 4, 2, 2, 0, -0, -1, -1, -1, -2, -3, -4, -4, -4, -4, -5, -6, -7, -9, -10, -11, -12, -12, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -11, -11, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 16, 18, 19, 13, 23, 35, 41, 41, 37, 36, 26, 25, 24, 24, 22, 21, 19, 17, 15, 11, 8, 6, 5, 7, 6, 4, 1, 0, -3, -7, -8, -11, -10, -10, -11, -12, -9, -9, -8, -7, -5, -4, -3, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 14, 15, 15, 15, 16, 17, 17, 18, 19, 20, 21, 22, 22, 24, 26, 25, 25, 25, 25, 25, 25, 25, 26, 28, 31, 32, 33, 33, 31, 32, 30, 29, 28, 29, 28, 29, 29, 29, 29, 29, 28, 24, 22, 18, 15, 14, 13, 11, 7, 6, 6, 7, 7, 7, 6, 9, 10, 9, 8, 6, 5, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 5, 6, 6, 6, 5, 3, 3, 1, 0, -1, -2, -4, -6, -8, -10, -12, -14, -16, -18, -19, -21, -23, -24, -26, -27, -27, -29, -32, -34, -36, -37, -38, -39, -39, -40, -40, -40, -40, -40, -39, -39, -38, -38, -38, -38, -38, -38, -38, -37, -34, -30, -26, -23, -20, -18, -18, -18, -17, -15, -14, -13, -12, -11, -10, -10, -8, -7, -5, -2, 0, 0, 1, 4, 7, 9, 12, 14, 16, 18, 20, 22, 24, 26, 29, 32, 34, 35, 36, 38, 41, 43, 43, 39, 37, 37, 37, 38, 41, 41, 42, 43, 44, 44, 43, 45, 46, 48, 49, 50, 50, 50, 50, 50, 50, 49, 48, 48, 47, 48, + /* -26.0 */ 49, 51, 50, 47, 34, 32, 34, 34, 31, 28, 25, 22, 20, 17, 15, 14, 12, 10, 9, 8, 7, 6, 4, 3, 2, 1, 0, -0, -1, -2, -2, -3, -4, -3, -5, -6, -7, -8, -9, -10, -11, -11, -12, -12, -13, -13, -13, -13, -13, -13, -13, -12, -11, -11, -11, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -1, -1, -0, -0, 0, 1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 6, 6, 8, 9, 9, 11, 13, 15, 16, 17, 18, 16, 20, 34, 41, 43, 41, 36, 29, 27, 25, 25, 23, 21, 19, 17, 14, 11, 7, 5, 4, 5, 5, 4, 2, -0, -2, -6, -10, -11, -11, -10, -11, -11, -11, -10, -9, -7, -6, -5, -5, -4, -4, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 14, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 22, 23, 25, 27, 29, 24, 25, 25, 25, 25, 26, 28, 31, 32, 34, 34, 30, 28, 29, 28, 27, 27, 26, 26, 26, 26, 26, 27, 26, 20, 19, 16, 13, 12, 10, 10, 6, 5, 4, 5, 5, 4, 5, 8, 9, 7, 5, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 0, -1, -2, -4, -5, -7, -9, -11, -13, -15, -17, -19, -20, -22, -24, -25, -27, -29, -30, -29, -31, -34, -36, -38, -39, -40, -40, -41, -42, -42, -42, -41, -39, -40, -40, -39, -38, -37, -37, -37, -38, -37, -35, -31, -27, -24, -22, -19, -17, -17, -17, -14, -12, -11, -11, -10, -8, -7, -6, -2, 0, 3, 4, 1, 2, 4, 8, 10, 12, 14, 17, 19, 21, 23, 24, 26, 28, 31, 35, 38, 39, 40, 42, 45, 45, 45, 42, 40, 40, 40, 41, 41, 43, 45, 46, 47, 46, 46, 47, 49, 50, 51, 51, 51, 52, 52, 51, 51, 50, 49, 49, 49, 49, + /* -25.0 */ 50, 51, 51, 50, 39, 28, 34, 34, 31, 28, 25, 22, 19, 17, 15, 14, 12, 10, 10, 9, 8, 7, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -4, -5, -5, -7, -8, -9, -9, -10, -11, -11, -12, -12, -12, -13, -13, -13, -13, -12, -11, -11, -11, -11, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, -0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 8, 8, 8, 10, 11, 12, 14, 17, 18, 19, 16, 18, 36, 38, 41, 43, 39, 29, 27, 26, 25, 23, 21, 19, 17, 13, 10, 6, 4, 3, 2, 3, 4, 2, -1, -2, -3, -6, -10, -12, -11, -12, -11, -11, -9, -9, -8, -7, -7, -6, -6, -6, -5, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 12, 13, 13, 13, 14, 14, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 26, 24, 24, 24, 24, 25, 28, 30, 32, 33, 33, 29, 28, 28, 27, 26, 24, 24, 24, 22, 21, 21, 19, 21, 15, 15, 12, 11, 11, 8, 7, 6, 4, 3, 3, 3, 2, 5, 8, 9, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -0, -0, -1, -2, -3, -4, -5, -6, -8, -10, -12, -14, -16, -18, -20, -22, -24, -25, -27, -28, -30, -32, -33, -32, -33, -36, -38, -39, -41, -41, -42, -43, -43, -43, -43, -43, -42, -41, -40, -39, -38, -38, -37, -37, -35, -34, -34, -30, -25, -22, -21, -18, -16, -16, -15, -12, -9, -7, -6, -7, -6, -4, -3, -3, 0, 2, 3, 3, 5, 7, 10, 13, 16, 19, 21, 24, 26, 27, 28, 29, 32, 34, 38, 41, 44, 46, 46, 47, 47, 47, 43, 43, 41, 43, 44, 44, 48, 47, 48, 49, 48, 48, 49, 51, 53, 54, 53, 52, 53, 53, 52, 52, 51, 50, 49, 49, 50, + /* -24.0 */ 50, 52, 52, 51, 45, 24, 32, 33, 31, 28, 25, 22, 20, 17, 15, 14, 12, 11, 11, 10, 8, 7, 6, 4, 3, 2, 1, 0, -1, -2, -4, -4, -4, -5, -6, -8, -8, -9, -9, -10, -11, -11, -12, -12, -12, -13, -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -8, -7, -7, -6, -6, -5, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 6, 6, 8, 8, 9, 11, 12, 14, 16, 18, 19, 17, 17, 32, 34, 40, 43, 43, 31, 27, 24, 24, 23, 20, 18, 16, 13, 9, 5, 2, 1, -1, -0, -0, -1, -3, -2, -3, -4, -6, -8, -9, -10, -12, -11, -10, -9, -9, -8, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -2, -1, 0, 2, 3, 4, 5, 7, 8, 9, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 25, 23, 23, 23, 23, 25, 28, 29, 31, 33, 32, 29, 27, 26, 26, 24, 23, 22, 21, 19, 17, 19, 18, 15, 11, 12, 9, 8, 9, 6, 4, 4, 3, 2, 2, 1, -0, 5, 7, 8, 6, 2, -1, -2, -2, -1, -1, -1, -1, -0, -1, -2, -2, -2, -1, -1, -2, -2, -3, -3, -4, -5, -6, -8, -9, -11, -13, -15, -17, -19, -22, -23, -25, -27, -29, -30, -31, -33, -34, -35, -35, -36, -38, -41, -42, -43, -43, -43, -44, -44, -44, -45, -44, -43, -42, -41, -40, -39, -37, -37, -35, -32, -32, -33, -30, -25, -21, -19, -16, -13, -11, -10, -8, -5, -4, -4, -4, -3, -1, 0, 2, 3, 4, 3, 5, 7, 10, 13, 17, 22, 24, 26, 28, 31, 32, 32, 33, 35, 38, 42, 46, 47, 48, 49, 49, 49, 48, 45, 44, 46, 47, 46, 47, 48, 49, 51, 50, 50, 50, 51, 54, 55, 55, 54, 53, 53, 54, 54, 53, 52, 51, 50, 50, 50, + /* -23.0 */ 50, 52, 52, 52, 51, 29, 28, 31, 30, 28, 25, 23, 20, 18, 16, 14, 13, 12, 11, 10, 9, 8, 6, 5, 3, 3, 2, 1, -1, -1, -3, -4, -5, -7, -7, -8, -8, -9, -9, -10, -10, -11, -11, -11, -12, -11, -12, -12, -11, -11, -11, -11, -11, -10, -10, -10, -9, -8, -8, -7, -6, -6, -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -0, 0, 0, 1, 1, 2, 2, 3, 4, 4, 6, 7, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 15, 33, 36, 40, 44, 43, 37, 25, 24, 23, 21, 19, 18, 16, 13, 9, 5, -0, -2, -3, -4, -5, -5, -5, -4, -2, -3, -4, -6, -6, -6, -11, -11, -10, -9, -9, -8, -8, -7, -7, -6, -6, -6, -6, -6, -5, -4, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 22, 23, 25, 26, 25, 24, 22, 22, 23, 24, 28, 29, 30, 32, 32, 30, 27, 25, 23, 22, 21, 19, 18, 17, 16, 15, 15, 14, 12, 10, 6, 6, 6, 3, 1, 0, 1, -0, -0, -1, -1, 3, 4, 6, 3, 1, -3, -4, -5, -4, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -5, -6, -7, -8, -9, -11, -13, -14, -17, -18, -21, -23, -25, -27, -28, -30, -32, -33, -35, -36, -37, -38, -38, -38, -41, -43, -43, -44, -45, -45, -45, -45, -46, -46, -45, -44, -43, -41, -39, -37, -37, -36, -34, -32, -31, -32, -31, -27, -21, -16, -13, -10, -9, -7, -5, -5, -2, -0, 1, 2, 3, 4, 6, 8, 9, 11, 13, 15, 19, 22, 24, 26, 28, 30, 33, 36, 37, 37, 37, 39, 42, 46, 49, 50, 50, 51, 51, 51, 50, 50, 48, 48, 49, 48, 50, 51, 52, 52, 52, 52, 52, 53, 57, 58, 57, 52, 49, 50, 50, 52, 53, 54, 52, 51, 50, 50, + /* -22.0 */ 50, 52, 52, 53, 52, 44, 26, 30, 30, 28, 26, 23, 21, 18, 15, 14, 13, 12, 11, 11, 10, 9, 8, 5, 4, 4, 2, 1, -0, -1, -3, -4, -5, -6, -6, -7, -8, -9, -9, -9, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -9, -8, -7, -7, -6, -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, 0, 1, 1, 2, 2, 3, 4, 6, 6, 7, 8, 9, 10, 11, 13, 16, 17, 19, 20, 15, 33, 37, 43, 44, 42, 39, 27, 23, 21, 21, 20, 18, 16, 14, 9, 4, -1, -3, -4, -6, -6, -7, -6, -5, -3, -3, -4, -5, -5, -6, -8, -10, -10, -10, -10, -9, -8, -7, -6, -6, -6, -6, -6, -6, -6, -5, -5, -3, -2, -1, 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 17, 17, 18, 19, 21, 22, 23, 24, 25, 24, 23, 22, 23, 24, 27, 28, 29, 30, 31, 29, 27, 25, 21, 19, 19, 18, 16, 16, 14, 13, 11, 10, 10, 8, 4, 3, 2, -1, -2, -3, -2, -2, -3, -3, -2, 0, 0, 4, 3, -0, -5, -7, -7, -7, -6, -5, -4, -4, -6, -6, -5, -5, -6, -6, -6, -7, -7, -8, -9, -10, -12, -14, -16, -18, -20, -22, -24, -26, -28, -30, -32, -33, -35, -37, -38, -39, -39, -40, -40, -40, -44, -45, -45, -46, -46, -46, -46, -46, -47, -47, -47, -45, -44, -42, -40, -35, -34, -36, -33, -31, -31, -31, -29, -27, -22, -15, -12, -9, -7, -7, -6, -2, 0, 3, 5, 5, 5, 7, 10, 13, 14, 15, 16, 19, 21, 25, 27, 30, 31, 34, 37, 40, 41, 41, 42, 43, 46, 49, 51, 52, 54, 53, 53, 54, 53, 52, 51, 51, 52, 51, 54, 52, 54, 54, 54, 53, 53, 59, 60, 58, 54, 51, 60, 61, 60, 58, 57, 54, 53, 51, 50, 50, + /* -21.0 */ 50, 52, 52, 53, 53, 52, 35, 27, 30, 28, 26, 23, 20, 18, 16, 14, 14, 12, 12, 11, 11, 9, 7, 6, 5, 4, 2, 1, 0, -0, -2, -3, -4, -5, -6, -7, -8, -8, -9, -9, -10, -10, -10, -10, -11, -11, -11, -12, -12, -12, -12, -12, -11, -11, -10, -10, -9, -8, -7, -6, -6, -5, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, 0, 1, 1, 2, 3, 4, 6, 8, 8, 9, 10, 12, 14, 16, 18, 20, 20, 16, 32, 38, 43, 42, 43, 40, 29, 22, 23, 21, 21, 18, 16, 14, 9, 4, -1, -4, -6, -7, -7, -7, -7, -6, -5, -4, -4, -5, -6, -6, -8, -11, -9, -10, -8, -6, -5, -6, -5, -6, -6, -6, -7, -6, -6, -6, -5, -4, -3, -2, -0, 1, 3, 4, 6, 7, 8, 10, 12, 12, 12, 13, 13, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 20, 22, 22, 23, 23, 23, 22, 23, 25, 26, 25, 27, 29, 28, 29, 28, 24, 21, 18, 18, 16, 15, 14, 13, 12, 10, 8, 5, 4, 3, 0, -2, -4, -5, -5, -6, -7, -6, -6, -5, -4, -3, 0, 3, -1, -6, -9, -9, -9, -9, -8, -1, -2, -10, -9, -8, -7, -8, -8, -9, -9, -10, -11, -12, -13, -15, -17, -19, -22, -23, -26, -28, -30, -32, -34, -35, -37, -39, -40, -41, -42, -42, -43, -43, -43, -46, -46, -46, -47, -48, -47, -47, -47, -47, -48, -47, -46, -44, -42, -39, -37, -35, -35, -33, -31, -30, -28, -27, -24, -22, -18, -12, -9, -8, -6, -3, 1, 4, 6, 7, 8, 9, 11, 14, 16, 17, 20, 22, 24, 26, 28, 31, 32, 34, 36, 40, 44, 44, 43, 44, 47, 50, 53, 54, 55, 55, 56, 55, 56, 56, 53, 52, 54, 54, 54, 57, 54, 57, 57, 54, 54, 62, 60, 60, 57, 50, 62, 64, 64, 63, 62, 60, 59, 54, 53, 51, 50, + /* -20.0 */ 50, 51, 51, 51, 52, 52, 43, 24, 29, 29, 26, 23, 21, 18, 16, 15, 13, 12, 11, 10, 9, 9, 10, 7, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -6, -6, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -11, -12, -12, -12, -11, -11, -11, -10, -10, -9, -8, -8, -7, -6, -6, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -2, -2, -1, -1, -0, 0, 1, 1, 2, 3, 5, 7, 8, 9, 11, 13, 15, 16, 18, 20, 19, 16, 34, 42, 43, 43, 44, 42, 30, 23, 24, 22, 20, 18, 16, 14, 9, 4, -1, -5, -7, -8, -8, -8, -9, -8, -8, -7, -6, -10, -6, -6, -7, -10, -7, -9, -7, -8, -7, -6, -5, -6, -6, -6, -7, -7, -7, -6, -6, -5, -3, -2, -1, 1, 3, 4, 6, 7, 8, 10, 12, 12, 12, 12, 13, 13, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 20, 21, 21, 23, 23, 24, 25, 25, 25, 26, 26, 26, 25, 23, 22, 19, 16, 15, 14, 13, 11, 11, 10, 10, 7, 5, 1, 1, -1, -4, -4, -9, -11, -9, -10, -10, -9, -8, -7, -6, -2, 1, -1, -7, -11, -11, -11, -11, -11, -11, -12, -12, -7, -12, -10, -11, -11, -11, -12, -12, -13, -15, -16, -18, -21, -23, -25, -27, -29, -32, -33, -35, -37, -39, -40, -42, -44, -45, -46, -47, -46, -45, -45, -48, -48, -48, -48, -48, -49, -48, -48, -48, -48, -47, -46, -44, -42, -40, -37, -35, -34, -32, -30, -28, -26, -24, -22, -19, -17, -12, -7, -6, -3, 1, 4, 8, 9, 10, 11, 14, 16, 18, 21, 23, 24, 24, 25, 28, 31, 33, 34, 37, 39, 43, 46, 45, 45, 48, 52, 55, 56, 57, 57, 57, 57, 57, 58, 56, 54, 55, 55, 55, 56, 58, 57, 58, 56, 56, 60, 59, 61, 58, 51, 55, 64, 65, 65, 64, 63, 61, 59, 57, 52, 51, 50, + /* -19.0 */ 51, 50, 51, 51, 51, 50, 47, 26, 29, 29, 29, 25, 21, 18, 16, 14, 12, 12, 11, 10, 10, 9, 8, 6, 5, 4, 3, 2, 2, 2, 1, -0, -2, -3, -5, -6, -6, -7, -8, -8, -9, -9, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -10, -10, -9, -9, -8, -7, -7, -6, -5, -5, -4, -4, -3, -3, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -4, -4, -4, -4, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -2, -2, -1, -1, -0, 1, 2, 3, 4, 6, 8, 10, 12, 13, 15, 17, 19, 21, 14, 20, 35, 44, 43, 44, 43, 39, 30, 22, 23, 22, 19, 17, 16, 12, 8, 4, -2, -5, -7, -8, -8, -11, -11, -9, -9, -10, -10, -11, -11, -9, -8, -7, -8, -11, -9, -8, -7, -6, -5, -5, -5, -6, -6, -7, -7, -7, -6, -5, -3, -2, -0, 1, 3, 5, 6, 7, 8, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 16, 16, 16, 16, 17, 17, 18, 19, 19, 19, 19, 20, 22, 24, 24, 26, 25, 23, 22, 22, 21, 20, 17, 14, 13, 12, 11, 10, 8, 6, 6, 6, 6, 2, -2, -5, -6, -7, -7, -11, -12, -13, -12, -11, -10, -10, -8, -3, -1, -2, -7, -13, -13, -14, -13, -13, -14, -15, -12, -10, -13, -13, -14, -15, -16, -15, -16, -17, -18, -20, -22, -25, -27, -29, -31, -34, -36, -37, -39, -41, -42, -44, -45, -47, -49, -49, -50, -51, -48, -47, -51, -51, -51, -50, -49, -50, -49, -49, -48, -47, -46, -45, -44, -42, -40, -37, -35, -33, -31, -29, -27, -24, -22, -20, -17, -15, -14, -7, -4, -0, 4, 8, 10, 11, 13, 16, 18, 20, 22, 24, 27, 29, 28, 29, 31, 34, 36, 37, 40, 42, 45, 47, 48, 49, 52, 56, 58, 59, 58, 58, 58, 58, 58, 59, 57, 57, 57, 58, 57, 56, 58, 58, 57, 57, 59, 59, 61, 60, 58, 53, 64, 66, 66, 65, 64, 63, 61, 59, 57, 55, 51, 51, + /* -18.0 */ 50, 51, 50, 49, 49, 48, 47, 33, 26, 29, 27, 25, 21, 18, 16, 14, 13, 13, 11, 10, 9, 8, 7, 7, 6, 4, 5, 3, 3, 3, 3, 3, -0, -3, -4, -4, -6, -7, -6, -7, -8, -9, -9, -10, -10, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -4, -4, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, -0, 1, 2, 4, 5, 8, 10, 12, 14, 16, 17, 17, 13, 18, 27, 38, 44, 44, 45, 41, 38, 30, 22, 22, 22, 21, 16, 13, 10, 6, 2, -1, -3, -6, -8, -9, -13, -13, -11, -12, -12, -11, -11, -10, -10, -9, -8, -6, -11, -7, -9, -8, -7, -6, -6, -6, -6, -7, -7, -7, -7, -6, -5, -3, -1, -0, 2, 3, 5, 6, 7, 8, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 17, 18, 17, 17, 18, 20, 22, 25, 26, 24, 21, 20, 19, 18, 17, 14, 12, 11, 10, 9, 8, 4, 3, 2, 3, 4, 2, -4, -8, -10, -10, -9, -11, -13, -14, -15, -14, -14, -11, -10, -7, -5, -5, -7, -13, -15, -16, -16, -16, -16, -16, -17, -17, -16, -16, -16, -17, -18, -19, -20, -21, -22, -24, -26, -29, -31, -33, -36, -38, -40, -41, -42, -44, -45, -47, -49, -50, -52, -53, -52, -54, -52, -48, -53, -53, -52, -52, -51, -50, -51, -49, -48, -47, -45, -44, -43, -41, -39, -36, -34, -32, -30, -27, -25, -22, -19, -17, -14, -12, -10, -7, -5, 0, 6, 8, 12, 14, 17, 20, 22, 24, 27, 28, 29, 32, 32, 33, 35, 37, 39, 41, 44, 45, 48, 50, 50, 51, 54, 57, 60, 60, 59, 58, 59, 60, 60, 60, 59, 59, 60, 60, 59, 57, 59, 58, 58, 59, 61, 60, 60, 60, 57, 58, 65, 67, 66, 65, 64, 63, 61, 59, 57, 56, 53, 50, + /* -17.0 */ 51, 50, 49, 48, 47, 46, 45, 36, 24, 28, 27, 24, 20, 17, 16, 14, 12, 12, 11, 10, 9, 8, 7, 7, 6, 6, 5, 4, 5, 5, 3, 1, -1, -3, -2, -3, -3, -4, -6, -7, -7, -8, -9, -10, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -3, -2, -2, -2, -2, -3, -3, -3, -3, -3, -4, -4, -5, -5, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -4, -4, -3, -3, -2, -1, -0, 1, 3, 5, 7, 10, 13, 15, 16, 14, 12, 19, 30, 39, 45, 45, 44, 43, 36, 25, 21, 23, 22, 22, 19, 14, 10, 7, 4, 1, -1, -3, -4, -7, -9, -12, -12, -13, -15, -15, -12, -12, -11, -10, -9, -8, -12, -10, -10, -9, -8, -8, -7, -7, -6, -7, -7, -8, -8, -7, -6, -4, -2, -1, 0, 2, 4, 5, 6, 7, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 17, 18, 21, 22, 23, 24, 22, 21, 19, 18, 17, 15, 13, 11, 10, 9, 7, 7, 7, -0, -1, 1, 1, -3, -9, -11, -11, -11, -12, -13, -13, -15, -18, -17, -16, -14, -12, -13, -11, -8, -9, -13, -17, -17, -18, -18, -17, -17, -19, -19, -17, -17, -20, -21, -22, -23, -24, -24, -26, -28, -30, -33, -35, -38, -40, -42, -44, -45, -46, -47, -49, -50, -52, -54, -55, -56, -57, -56, -54, -51, -55, -54, -54, -53, -52, -49, -51, -49, -48, -46, -44, -42, -42, -40, -37, -35, -33, -31, -28, -25, -22, -20, -17, -14, -10, -9, -6, -6, -4, -0, 7, 12, 16, 19, 22, 24, 26, 29, 31, 33, 31, 33, 35, 36, 38, 39, 43, 45, 45, 48, 50, 52, 52, 54, 57, 59, 61, 62, 59, 60, 61, 63, 63, 63, 61, 61, 61, 61, 60, 60, 60, 59, 58, 60, 59, 60, 60, 60, 58, 62, 66, 66, 66, 65, 63, 62, 61, 59, 58, 55, 54, 51, + /* -16.0 */ 52, 49, 48, 46, 45, 44, 42, 34, 22, 28, 26, 23, 20, 17, 16, 14, 12, 12, 11, 10, 9, 8, 7, 7, 7, 6, 6, 5, 5, 4, 2, 1, -1, 1, -0, -2, -4, -5, -5, -5, -6, -8, -9, -10, -10, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -4, -5, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -5, -4, -4, -3, -3, -2, -1, 0, 2, 5, 7, 10, 13, 15, 13, 15, 30, 38, 42, 45, 45, 46, 41, 32, 25, 22, 22, 24, 22, 21, 17, 13, 9, 5, 2, -0, -2, -4, -5, -6, -8, -11, -13, -13, -14, -14, -13, -12, -11, -9, -9, -8, -9, -14, -11, -9, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -6, -4, -3, -2, -0, 2, 3, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 13, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 20, 23, 24, 24, 22, 20, 18, 17, 16, 14, 12, 10, 8, 7, 7, 5, 3, 2, -3, -5, -9, -8, -10, -12, -11, -10, -14, -15, -16, -15, -22, -20, -21, -19, -18, -18, -17, -13, -10, -14, -18, -19, -20, -20, -19, -20, -21, -22, -20, -19, -21, -25, -26, -27, -27, -28, -29, -32, -34, -37, -40, -42, -45, -46, -48, -50, -50, -51, -52, -54, -55, -57, -58, -59, -59, -58, -57, -54, -57, -56, -56, -54, -53, -52, -50, -49, -46, -45, -43, -40, -40, -37, -35, -33, -31, -28, -25, -22, -19, -18, -15, -11, -9, -8, -6, -3, -1, 2, 8, 14, 20, 22, 25, 27, 29, 33, 34, 35, 34, 35, 37, 39, 41, 43, 45, 47, 49, 50, 51, 52, 54, 56, 59, 62, 63, 62, 61, 63, 63, 64, 64, 63, 61, 61, 61, 62, 63, 62, 62, 61, 61, 60, 60, 59, 61, 60, 62, 64, 66, 66, 65, 64, 62, 61, 59, 58, 56, 54, 53, 52, + /* -15.0 */ 49, 48, 46, 45, 44, 42, 38, 27, 27, 29, 26, 23, 20, 17, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 6, 6, 5, 3, 2, 1, 1, 2, 0, -2, -3, -4, -5, -5, -6, -7, -8, -9, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -7, -7, -6, -6, -5, -4, -4, -4, -3, -3, -3, -3, -3, -4, -4, -5, -5, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -5, -5, -4, -4, -3, -2, -0, 2, 4, 7, 10, 12, 11, 15, 30, 38, 44, 46, 47, 47, 45, 33, 27, 27, 26, 25, 22, 20, 19, 16, 13, 8, 3, -0, -2, -4, -5, -6, -7, -9, -12, -14, -15, -14, -13, -13, -13, -11, -10, -11, -8, -13, -14, -12, -11, -9, -8, -8, -7, -7, -7, -7, -7, -7, -6, -5, -4, -3, -2, -0, 1, 3, 5, 6, 7, 9, 10, 10, 10, 11, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 18, 21, 22, 24, 22, 20, 18, 16, 15, 13, 11, 9, 7, 5, 4, 3, 2, -0, -3, -8, -9, -10, -11, -10, -12, -14, -16, -18, -19, -20, -23, -21, -23, -24, -26, -23, -20, -18, -14, -15, -19, -22, -22, -23, -22, -22, -23, -24, -27, -24, -24, -28, -29, -30, -31, -32, -33, -36, -38, -41, -43, -46, -49, -51, -52, -53, -54, -55, -56, -57, -58, -59, -60, -61, -61, -58, -56, -56, -59, -58, -57, -55, -54, -53, -49, -48, -44, -43, -41, -40, -37, -34, -32, -31, -28, -25, -22, -18, -15, -14, -12, -8, -5, -3, -1, 1, 4, 6, 10, 15, 21, 26, 28, 30, 32, 35, 37, 37, 37, 39, 41, 43, 45, 47, 48, 51, 53, 52, 52, 54, 56, 58, 61, 64, 65, 63, 63, 64, 64, 63, 62, 61, 62, 62, 63, 63, 63, 64, 63, 64, 62, 61, 62, 63, 59, 54, 62, 64, 65, 65, 64, 63, 61, 59, 58, 56, 55, 53, 51, 49, + /* -14.0 */ 47, 46, 44, 43, 38, 36, 32, 31, 33, 30, 29, 24, 19, 17, 16, 14, 13, 13, 12, 10, 9, 8, 7, 7, 6, 6, 5, 4, 3, 2, 3, 1, -1, -2, -3, -3, -4, -5, -6, -6, -7, -7, -8, -9, -9, -9, -10, -10, -10, -9, -10, -9, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -4, -4, -4, -4, -5, -5, -6, -6, -7, -8, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -6, -6, -5, -5, -4, -3, -2, -1, 1, 4, 6, 9, 9, 12, 24, 38, 37, 40, 45, 49, 44, 34, 31, 29, 29, 28, 25, 21, 19, 18, 15, 12, 10, 4, -2, -4, -6, -8, -9, -10, -10, -11, -15, -17, -14, -13, -13, -13, -14, -12, -10, -9, -12, -13, -12, -11, -10, -9, -8, -7, -7, -7, -7, -7, -7, -6, -5, -4, -3, -1, 0, 2, 4, 5, 6, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 14, 15, 15, 16, 17, 19, 21, 22, 22, 21, 18, 16, 14, 12, 9, 6, 5, 4, 3, 1, -0, -2, -5, -7, -11, -11, -12, -11, -16, -17, -19, -20, -20, -22, -24, -23, -25, -26, -27, -25, -24, -18, -16, -16, -22, -24, -24, -25, -25, -25, -26, -27, -29, -29, -27, -31, -32, -34, -35, -36, -37, -40, -42, -45, -47, -50, -53, -55, -56, -58, -59, -60, -60, -61, -62, -62, -62, -64, -64, -63, -61, -60, -60, -59, -59, -56, -55, -53, -50, -46, -42, -41, -40, -38, -35, -30, -28, -27, -25, -21, -17, -14, -9, -10, -8, -4, -1, 1, 3, 6, 8, 10, 14, 19, 22, 27, 29, 32, 34, 36, 38, 39, 42, 42, 45, 48, 50, 51, 52, 54, 55, 55, 55, 57, 59, 62, 64, 66, 65, 64, 65, 64, 62, 62, 63, 63, 63, 64, 65, 66, 65, 64, 64, 65, 64, 64, 63, 62, 62, 52, 57, 65, 64, 64, 63, 61, 59, 58, 56, 54, 53, 51, 50, 47, + /* -13.0 */ 41, 44, 41, 36, 36, 34, 32, 29, 28, 25, 24, 21, 19, 17, 15, 14, 13, 14, 13, 12, 10, 9, 8, 7, 7, 6, 4, 4, 3, 2, 1, 0, -0, -1, -3, -3, -4, -4, -5, -5, -6, -6, -7, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -7, -7, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5, -6, -7, -7, -8, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -7, -7, -6, -6, -5, -4, -4, -2, -1, 1, 4, 6, 6, 7, 17, 32, 36, 34, 36, 41, 37, 31, 30, 31, 31, 29, 27, 24, 21, 19, 17, 13, 12, 11, 5, -2, -5, -8, -8, -8, -11, -12, -12, -16, -18, -14, -13, -14, -16, -13, -12, -11, -11, -11, -12, -13, -12, -10, -9, -8, -8, -8, -8, -8, -7, -7, -6, -5, -4, -3, -1, 1, 2, 4, 5, 7, 9, 9, 9, 10, 10, 10, 11, 12, 12, 14, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 15, 16, 17, 18, 22, 21, 22, 22, 18, 15, 13, 11, 8, 5, 4, 2, 1, 0, -2, -5, -5, -6, -10, -14, -12, -15, -19, -17, -21, -22, -21, -22, -25, -27, -28, -27, -22, -27, -27, -21, -18, -21, -26, -26, -27, -28, -27, -28, -29, -30, -32, -34, -31, -34, -36, -37, -38, -39, -42, -44, -46, -49, -51, -54, -57, -59, -60, -62, -64, -64, -64, -64, -65, -65, -65, -66, -67, -65, -66, -63, -60, -61, -59, -57, -56, -53, -48, -43, -42, -40, -38, -37, -31, -26, -24, -22, -19, -17, -13, -10, -6, -4, -3, 1, 3, 5, 7, 11, 12, 15, 18, 23, 26, 29, 32, 35, 36, 37, 39, 42, 44, 46, 49, 52, 54, 55, 56, 57, 58, 58, 59, 60, 61, 64, 67, 65, 64, 66, 65, 65, 65, 64, 64, 64, 64, 65, 67, 68, 68, 66, 66, 64, 65, 64, 63, 62, 59, 48, 59, 62, 62, 62, 60, 59, 57, 56, 54, 52, 50, 48, 46, 41, + /* -12.0 */ 43, 41, 39, 35, 34, 31, 31, 27, 26, 25, 23, 20, 18, 17, 15, 15, 14, 14, 14, 13, 10, 9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 1, 0, -0, -2, -2, -4, -4, -5, -5, -5, -5, -5, -6, -7, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -7, -8, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -6, -5, -4, -3, -2, -1, 1, 3, 4, 2, 10, 24, 32, 33, 31, 31, 31, 28, 27, 29, 29, 30, 27, 23, 21, 19, 18, 15, 11, 9, 8, 2, -5, -8, -10, -9, -11, -14, -16, -14, -15, -17, -16, -16, -16, -16, -13, -12, -12, -12, -11, -12, -13, -12, -11, -9, -9, -9, -9, -9, -8, -8, -7, -6, -5, -4, -2, -0, 2, 3, 5, 6, 7, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 12, 12, 13, 14, 15, 16, 17, 17, 19, 21, 22, 21, 19, 15, 12, 10, 7, 5, 3, 1, -0, -2, -3, -5, -7, -9, -10, -13, -13, -16, -19, -19, -23, -24, -24, -23, -26, -27, -26, -24, -27, -28, -29, -25, -24, -26, -29, -29, -30, -30, -30, -31, -32, -33, -35, -37, -34, -36, -39, -41, -42, -44, -46, -48, -51, -53, -55, -58, -61, -63, -64, -66, -68, -68, -68, -68, -68, -69, -68, -68, -69, -68, -67, -65, -62, -63, -59, -58, -56, -52, -48, -44, -39, -38, -36, -33, -28, -24, -21, -17, -14, -13, -9, -7, -3, 0, 3, 6, 7, 8, 10, 13, 15, 17, 21, 23, 25, 30, 35, 37, 38, 41, 43, 45, 46, 49, 52, 54, 56, 57, 59, 60, 61, 62, 62, 62, 63, 67, 69, 68, 67, 68, 67, 67, 65, 65, 66, 66, 66, 67, 65, 67, 68, 67, 63, 67, 64, 62, 61, 60, 56, 46, 58, 61, 60, 60, 58, 57, 53, 52, 50, 49, 46, 46, 42, 43, + /* -11.0 */ 39, 38, 34, 33, 31, 29, 28, 27, 26, 24, 22, 20, 19, 17, 17, 15, 15, 15, 15, 12, 11, 9, 8, 8, 7, 6, 6, 5, 5, 4, 3, 3, 2, 1, -0, -2, -2, -3, -3, -4, -4, -4, -4, -5, -6, -7, -7, -8, -8, -9, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -7, -7, -8, -9, -9, -10, -10, -11, -11, -11, -11, -11, -11, -11, -10, -10, -10, -9, -9, -8, -7, -6, -5, -4, -2, -1, 1, 2, -0, 2, 15, 27, 32, 31, 29, 28, 26, 27, 28, 28, 27, 27, 24, 21, 19, 18, 15, 11, 7, 2, -2, -4, -9, -10, -10, -11, -12, -16, -19, -17, -16, -16, -16, -17, -17, -16, -16, -13, -12, -13, -12, -10, -10, -12, -11, -11, -10, -10, -9, -9, -8, -8, -7, -6, -5, -3, -1, 1, 2, 4, 6, 7, 8, 10, 11, 12, 11, 11, 11, 11, 12, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 11, 11, 12, 13, 14, 14, 15, 17, 18, 18, 20, 19, 16, 13, 10, 8, 6, 4, 1, -1, -1, -3, -4, -6, -9, -10, -11, -12, -14, -15, -17, -18, -22, -25, -24, -24, -27, -27, -29, -29, -30, -31, -30, -31, -30, -30, -31, -30, -31, -32, -32, -33, -34, -36, -37, -38, -36, -38, -42, -45, -47, -48, -50, -52, -55, -57, -58, -62, -65, -67, -69, -70, -71, -72, -72, -72, -72, -72, -72, -70, -70, -70, -68, -67, -63, -65, -60, -57, -55, -52, -48, -44, -39, -37, -33, -29, -26, -23, -19, -14, -8, -8, -7, -5, -2, -0, 3, 5, 5, 4, 7, 11, 13, 16, 18, 23, 27, 29, 30, 31, 37, 42, 46, 48, 49, 52, 55, 57, 59, 59, 60, 62, 63, 64, 66, 66, 67, 69, 72, 72, 70, 70, 69, 68, 69, 72, 75, 74, 74, 72, 70, 65, 69, 68, 65, 64, 58, 62, 56, 55, 52, 54, 58, 59, 57, 56, 52, 51, 49, 46, 45, 43, 41, 40, 39, 39, + /* -10.0 */ 35, 33, 31, 30, 29, 27, 27, 26, 25, 22, 21, 20, 18, 17, 16, 15, 16, 15, 14, 13, 11, 10, 8, 8, 7, 7, 7, 6, 6, 5, 5, 4, 2, 2, 0, -1, -1, -2, -2, -3, -3, 1, -2, -4, -5, -6, -7, -7, -8, -9, -9, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -10, -10, -9, -9, -8, -8, -8, -8, -8, -8, -9, -9, -10, -11, -11, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -9, -8, -7, -6, -5, -4, -2, -1, 1, 0, -1, 9, 20, 24, 28, 27, 23, 26, 26, 27, 27, 26, 25, 23, 21, 18, 16, 14, 11, 7, 3, -1, -4, -4, -7, -10, -12, -12, -13, -15, -19, -19, -19, -19, -17, -16, -15, -17, -17, -14, -12, -12, -11, -9, -9, -12, -11, -11, -11, -10, -10, -9, -8, -7, -7, -6, -4, -3, -1, 2, 4, 5, 7, 8, 9, 10, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 10, 10, 10, 10, 10, 10, 11, 11, 12, 13, 14, 15, 17, 17, 17, 16, 13, 11, 8, 6, 4, 2, -2, -4, -5, -5, -7, -6, -9, -13, -12, -11, -12, -17, -15, -19, -22, -23, -24, -27, -31, -30, -32, -32, -33, -33, -34, -33, -33, -32, -30, -32, -33, -33, -34, -35, -36, -38, -39, -38, -39, -42, -46, -49, -51, -52, -54, -56, -59, -61, -63, -65, -68, -71, -73, -74, -75, -76, -76, -76, -75, -75, -75, -74, -71, -70, -69, -68, -65, -65, -60, -58, -54, -52, -47, -43, -39, -35, -32, -27, -23, -21, -16, -11, -6, -5, -8, -7, -4, -2, 1, 5, 10, 10, 11, 14, 16, 19, 27, 36, 34, 27, 27, 33, 33, 36, 42, 47, 50, 52, 55, 58, 60, 61, 63, 65, 64, 66, 68, 69, 70, 72, 74, 74, 71, 69, 69, 75, 78, 78, 77, 74, 73, 73, 71, 70, 67, 66, 63, 63, 63, 58, 60, 60, 58, 58, 57, 56, 54, 51, 50, 47, 44, 43, 41, 39, 38, 36, 35, 35, + /* -9.0 */ 32, 29, 29, 27, 26, 25, 24, 24, 23, 22, 20, 19, 17, 17, 16, 15, 15, 15, 13, 12, 11, 9, 12, 9, 8, 8, 8, 7, 7, 7, 5, 5, 3, 2, 1, 0, 0, -0, -1, -0, 2, -2, -3, -3, -4, -6, -7, -8, -8, -9, -10, -10, -10, -11, -11, -11, -11, -12, -12, -12, -13, -13, -12, -12, -12, -11, -11, -10, -10, -9, -9, -9, -9, -9, -10, -10, -11, -12, -12, -12, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -10, -9, -8, -7, -5, -4, -2, -0, 0, -2, 6, 14, 19, 19, 18, 19, 21, 25, 25, 26, 26, 24, 23, 20, 17, 14, 12, 11, 8, 4, 1, -3, -5, -8, -10, -13, -15, -16, -16, -17, -21, -22, -21, -21, -20, -19, -18, -16, -14, -14, -12, -11, -9, -8, -7, -8, -11, -11, -11, -10, -10, -9, -8, -7, -6, -5, -4, -2, -0, 2, 4, 6, 8, 9, 10, 12, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 12, 10, 10, 9, 9, 9, 9, 9, 10, 10, 11, 11, 13, 16, 16, 15, 13, 10, 8, 6, 4, 2, -0, -3, -6, -8, -10, -9, -8, -12, -14, -13, -11, -12, -14, -13, -19, -21, -24, -25, -31, -33, -33, -34, -35, -35, -37, -34, -38, -35, -34, -34, -34, -36, -35, -36, -37, -38, -40, -41, -40, -44, -46, -49, -52, -54, -56, -58, -60, -63, -64, -66, -69, -72, -75, -76, -78, -79, -80, -80, -79, -78, -77, -77, -76, -74, -72, -70, -68, -65, -65, -60, -58, -55, -50, -46, -42, -37, -32, -30, -25, -21, -17, -13, -10, -9, -9, -6, -3, 1, 7, 11, 16, 21, 24, 27, 31, 35, 33, 36, 40, 37, 35, 32, 37, 42, 42, 37, 34, 41, 46, 52, 56, 60, 62, 65, 67, 66, 67, 69, 70, 71, 73, 75, 74, 74, 71, 77, 82, 78, 78, 78, 77, 74, 73, 71, 70, 69, 67, 63, 62, 62, 54, 60, 59, 56, 56, 54, 52, 49, 48, 45, 43, 42, 41, 39, 38, 36, 35, 33, 32, + /* -8.0 */ 29, 27, 26, 25, 24, 22, 21, 21, 20, 20, 19, 18, 17, 17, 17, 16, 15, 15, 14, 12, 12, 10, 10, 10, 9, 9, 9, 9, 8, 8, 6, 5, 4, 3, 2, 2, 2, 1, 0, 3, 1, -1, -2, -3, -4, -5, -6, -8, -8, -9, -10, -10, -11, -12, -12, -12, -13, -13, -13, -14, -13, -13, -13, -13, -13, -13, -12, -12, -11, -11, -11, -10, -10, -10, -11, -11, -11, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -12, -12, -11, -10, -9, -8, -7, -5, -4, -2, -0, -0, -2, 9, 15, 20, 13, 12, 15, 21, 23, 24, 26, 24, 22, 20, 18, 15, 11, 10, 8, 4, 1, -1, -4, -7, -10, -14, -16, -18, -19, -19, -20, -22, -23, -23, -23, -23, -23, -22, -19, -16, -13, -11, -10, -8, -6, -5, -5, -10, -11, -11, -11, -9, -8, -8, -7, -6, -5, -4, -2, 0, 2, 4, 6, 8, 10, 11, 12, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 13, 10, 10, 9, 9, 8, 8, 8, 9, 9, 10, 11, 13, 13, 12, 10, 7, 6, 4, 1, -1, -3, -5, -7, -8, -12, -14, -11, -12, -11, -14, -14, -15, -17, -15, -17, -22, -25, -27, -29, -34, -35, -36, -37, -38, -40, -36, -40, -38, -36, -37, -36, -37, -38, -38, -39, -41, -42, -43, -44, -47, -50, -53, -55, -58, -60, -61, -63, -66, -69, -69, -72, -76, -79, -80, -82, -82, -83, -84, -83, -82, -81, -80, -79, -77, -75, -72, -70, -66, -65, -61, -58, -54, -50, -45, -42, -35, -30, -26, -23, -19, -15, -13, -12, -12, -7, 2, 12, 19, 24, 25, 27, 30, 33, 34, 33, 35, 37, 37, 38, 38, 41, 43, 45, 46, 48, 46, 42, 42, 46, 47, 51, 59, 63, 66, 67, 68, 69, 70, 71, 72, 74, 75, 75, 74, 75, 84, 75, 68, 72, 73, 69, 71, 69, 69, 68, 70, 65, 63, 61, 57, 59, 58, 56, 54, 51, 50, 49, 47, 44, 42, 41, 39, 39, 37, 36, 34, 33, 31, 29, + /* -7.0 */ 27, 25, 24, 22, 21, 21, 20, 19, 20, 19, 18, 17, 17, 17, 17, 16, 15, 14, 14, 13, 12, 12, 11, 11, 11, 10, 10, 9, 9, 8, 7, 6, 5, 4, 4, 3, 3, 3, 2, 0, -0, -0, -1, -2, -4, -5, -6, -7, -8, -9, -10, -10, -11, -12, -12, -13, -13, -14, -14, -14, -15, -15, -15, -14, -14, -14, -14, -13, -13, -12, -12, -12, -12, -11, -12, -12, -12, -13, -13, -13, -13, -13, -13, -13, -14, -13, -13, -13, -12, -12, -11, -10, -8, -7, -5, -3, -2, -0, -2, 3, 9, 17, 19, 11, 12, 16, 20, 22, 23, 24, 23, 22, 19, 16, 13, 9, 7, 4, 1, -2, -4, -6, -9, -12, -16, -18, -20, -21, -21, -21, -22, -23, -24, -24, -25, -24, -23, -21, -18, -14, -11, -10, -9, -6, -4, -4, -9, -10, -9, -9, -8, -7, -7, -6, -5, -4, -2, -1, 1, 3, 5, 8, 9, 10, 12, 13, 14, 15, 16, 16, 16, 16, 16, 15, 15, 15, 16, 16, 16, 16, 15, 13, 11, 10, 9, 9, 8, 8, 7, 7, 8, 11, 13, 11, 10, 9, 7, 5, 3, 1, -2, -5, -7, -9, -10, -11, -13, -16, -15, -11, -11, -13, -14, -16, -16, -19, -20, -22, -25, -27, -30, -34, -36, -37, -38, -39, -40, -43, -43, -39, -39, -38, -38, -39, -39, -40, -42, -43, -44, -45, -49, -51, -53, -56, -58, -61, -63, -65, -66, -69, -73, -73, -74, -78, -82, -84, -85, -86, -86, -87, -86, -84, -82, -81, -81, -78, -76, -73, -70, -65, -64, -61, -58, -52, -48, -44, -40, -34, -29, -23, -18, -17, -15, -12, -9, -6, 8, 20, 22, 22, 24, 25, 28, 31, 34, 37, 39, 41, 43, 44, 44, 49, 48, 48, 49, 50, 50, 50, 50, 50, 45, 42, 46, 54, 63, 67, 68, 70, 70, 70, 72, 73, 75, 76, 77, 77, 78, 73, 60, 59, 65, 67, 70, 68, 60, 63, 70, 67, 62, 59, 56, 59, 58, 55, 53, 52, 50, 48, 46, 44, 42, 40, 39, 37, 37, 35, 32, 31, 30, 29, 27, + /* -6.0 */ 26, 24, 22, 21, 20, 19, 19, 18, 19, 18, 17, 17, 17, 17, 17, 16, 16, 15, 15, 14, 13, 12, 12, 12, 12, 11, 11, 10, 10, 10, 9, 7, 7, 6, 5, 5, 4, 3, 3, 1, 1, 0, -1, -2, -4, -5, -6, -7, -8, -9, -10, -10, -11, -12, -13, -14, -14, -14, -15, -15, -15, -15, -16, -16, -15, -15, -15, -15, -14, -13, -13, -13, -13, -13, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -12, -12, -11, -9, -8, -6, -5, -3, -1, -0, -3, 8, 10, 17, 19, 14, 13, 15, 18, 20, 22, 23, 23, 21, 18, 14, 12, 8, 3, 1, -2, -5, -6, -9, -11, -14, -17, -19, -21, -21, -22, -22, -23, -24, -24, -26, -25, -24, -23, -22, -19, -15, -12, -11, -8, -7, -5, -5, -8, -8, -8, -8, -7, -6, -6, -5, -3, -2, -1, 1, 2, 4, 6, 8, 10, 12, 13, 14, 15, 16, 17, 18, 17, 17, 16, 16, 16, 16, 16, 17, 17, 17, 16, 15, 12, 11, 9, 9, 8, 7, 7, 7, 8, 9, 11, 7, 6, 5, 4, 1, -1, -4, -6, -8, -10, -13, -15, -15, -15, -16, -15, -13, -13, -13, -15, -18, -18, -20, -20, -19, -23, -28, -32, -34, -37, -39, -39, -40, -41, -42, -42, -42, -41, -40, -40, -39, -41, -42, -43, -44, -45, -49, -51, -54, -56, -59, -61, -64, -66, -68, -69, -72, -76, -77, -76, -80, -86, -87, -88, -89, -89, -90, -90, -89, -87, -86, -84, -81, -77, -75, -71, -66, -63, -61, -56, -51, -48, -44, -37, -31, -27, -21, -17, -17, -12, -10, -4, 8, 14, 19, 21, 24, 26, 28, 31, 34, 37, 40, 42, 44, 46, 47, 50, 49, 51, 52, 55, 55, 54, 54, 53, 53, 50, 35, 44, 53, 58, 66, 68, 70, 70, 70, 73, 75, 79, 81, 82, 81, 72, 71, 70, 75, 81, 75, 60, 57, 56, 71, 65, 63, 60, 60, 60, 58, 56, 54, 52, 49, 47, 45, 44, 42, 40, 39, 37, 36, 34, 33, 32, 31, 28, 27, 26, + /* -5.0 */ 24, 23, 21, 20, 20, 19, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 16, 15, 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 10, 9, 8, 8, 7, 6, 5, 4, 3, 2, 1, -0, -1, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -12, -13, -14, -14, -15, -15, -16, -16, -17, -17, -17, -17, -16, -16, -16, -16, -15, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -12, -11, -10, -9, -8, -6, -4, -2, -0, 1, -2, 11, 17, 18, 11, 10, 11, 15, 19, 21, 21, 22, 20, 19, 15, 13, 10, 6, 0, -3, -4, -6, -8, -11, -13, -16, -18, -20, -21, -22, -22, -22, -24, -25, -25, -26, -26, -25, -23, -22, -19, -15, -12, -10, -8, -7, -6, -7, -8, -8, -7, -6, -5, -5, -4, -3, -2, -1, 0, 2, 3, 5, 7, 9, 11, 12, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 14, 12, 10, 9, 8, 8, 7, 7, 6, 6, 4, 4, 3, 2, 0, -2, -6, -8, -10, -12, -14, -15, -16, -17, -16, -16, -15, -13, -15, -15, -16, -19, -20, -19, -19, -18, -23, -27, -30, -34, -38, -40, -41, -42, -42, -43, -43, -43, -43, -42, -42, -41, -43, -41, -41, -44, -49, -51, -54, -56, -59, -61, -64, -66, -69, -71, -72, -75, -78, -81, -81, -84, -88, -90, -91, -91, -92, -93, -93, -92, -88, -87, -86, -83, -79, -76, -72, -67, -64, -60, -56, -50, -46, -42, -35, -30, -24, -19, -19, -15, -9, -4, 8, 13, 16, 20, 23, 26, 28, 30, 33, 36, 40, 43, 45, 47, 47, 50, 54, 54, 57, 57, 56, 56, 58, 58, 58, 56, 55, 43, 49, 59, 57, 68, 68, 70, 69, 72, 76, 81, 84, 81, 77, 70, 68, 74, 78, 80, 82, 80, 74, 58, 60, 64, 66, 66, 63, 61, 59, 57, 54, 52, 50, 47, 45, 43, 42, 41, 39, 37, 35, 34, 33, 31, 29, 28, 27, 26, 24, + /* -4.0 */ 24, 22, 21, 20, 19, 19, 18, 18, 18, 18, 16, 17, 17, 16, 17, 17, 17, 16, 15, 14, 14, 14, 14, 14, 14, 14, 13, 12, 13, 12, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, -0, -2, -3, -4, -5, -6, -7, -9, -9, -10, -11, -12, -13, -14, -15, -15, -16, -16, -17, -18, -18, -18, -18, -18, -18, -18, -17, -17, -16, -16, -16, -15, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -14, -14, -13, -13, -12, -11, -11, -9, -8, -7, -5, -3, -1, 1, 2, 0, 8, 16, 17, 13, 10, 12, 16, 20, 21, 21, 20, 18, 16, 13, 10, 8, 4, -2, -5, -6, -7, -8, -10, -12, -16, -20, -20, -20, -21, -22, -23, -24, -25, -25, -26, -27, -26, -23, -21, -19, -15, -13, -10, -8, -9, -8, -8, -7, -6, -6, -6, -4, -3, -3, -2, -1, 0, 1, 3, 5, 6, 7, 10, 11, 13, 14, 16, 17, 18, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 15, 14, 12, 11, 9, 8, 8, 5, 5, 5, 3, 3, 3, 1, -2, -6, -9, -10, -13, -14, -15, -17, -18, -18, -18, -16, -15, -12, -12, -15, -17, -19, -20, -19, -19, -18, -21, -24, -31, -33, -37, -40, -41, -43, -44, -44, -44, -44, -44, -44, -44, -44, -44, -42, -44, -49, -51, -54, -56, -59, -61, -64, -67, -69, -71, -73, -75, -77, -81, -84, -86, -87, -90, -92, -93, -94, -94, -95, -94, -94, -91, -87, -87, -85, -80, -76, -73, -66, -63, -60, -55, -49, -44, -39, -33, -28, -22, -19, -19, -10, -3, 7, 11, 14, 17, 21, 24, 27, 29, 32, 35, 39, 42, 44, 48, 50, 48, 51, 57, 57, 61, 59, 56, 58, 59, 59, 59, 59, 58, 57, 54, 65, 67, 70, 76, 81, 82, 81, 77, 79, 78, 77, 75, 75, 77, 79, 81, 81, 80, 78, 74, 66, 63, 63, 65, 64, 61, 59, 56, 54, 52, 50, 48, 45, 44, 43, 41, 40, 38, 35, 34, 32, 30, 29, 29, 27, 26, 25, 24, + /* -3.0 */ 23, 21, 20, 20, 19, 19, 18, 18, 18, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 15, 15, 14, 14, 14, 14, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, -0, -1, -3, -4, -5, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -17, -18, -18, -19, -19, -19, -20, -19, -19, -19, -18, -18, -18, -17, -17, -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -13, -13, -12, -12, -11, -10, -8, -7, -6, -4, -3, -0, 2, 4, 3, 5, 10, 22, 16, 10, 14, 18, 20, 20, 19, 18, 17, 14, 10, 8, 6, 2, -2, -4, -7, -9, -12, -15, -15, -15, -18, -18, -19, -20, -22, -22, -24, -25, -26, -26, -27, -27, -24, -22, -20, -16, -13, -11, -11, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 4, 5, 6, 8, 10, 11, 13, 15, 16, 18, 19, 20, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 17, 15, 14, 13, 11, 10, 8, 8, 7, 4, 4, 5, 4, 2, -2, -8, -11, -13, -15, -15, -18, -20, -19, -19, -18, -16, -14, -9, -9, -13, -16, -18, -19, -18, -18, -16, -20, -25, -30, -31, -38, -40, -41, -43, -45, -45, -46, -46, -45, -45, -45, -46, -46, -47, -49, -51, -53, -55, -58, -61, -64, -66, -69, -71, -73, -75, -77, -80, -84, -87, -89, -90, -92, -95, -96, -97, -97, -98, -98, -96, -93, -88, -89, -87, -82, -77, -73, -67, -63, -59, -54, -48, -43, -37, -31, -27, -21, -23, -15, -10, 4, 8, 12, 15, 18, 22, 25, 28, 31, 34, 38, 41, 43, 45, 50, 53, 54, 56, 61, 61, 61, 58, 58, 60, 60, 59, 58, 60, 60, 59, 63, 69, 69, 69, 69, 77, 78, 76, 77, 78, 77, 78, 78, 79, 79, 80, 79, 78, 77, 76, 71, 67, 62, 63, 63, 61, 59, 56, 54, 52, 50, 48, 45, 44, 42, 40, 39, 38, 37, 34, 33, 32, 30, 27, 26, 26, 25, 24, 23, + /* -2.0 */ 22, 21, 20, 19, 19, 19, 17, 17, 17, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 13, 12, 12, 11, 10, 9, 8, 6, 5, 4, 3, 1, -0, -2, -3, -4, -6, -7, -8, -9, -10, -11, -13, -14, -15, -16, -17, -18, -19, -19, -20, -20, -21, -21, -21, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -14, -14, -13, -13, -13, -12, -11, -11, -10, -9, -8, -7, -5, -4, -2, 0, 3, 5, 6, 11, 18, 23, 23, 14, 16, 19, 20, 19, 17, 16, 15, 14, 10, 7, 5, 1, -2, -5, -7, -9, -12, -15, -16, -17, -19, -22, -22, -22, -23, -23, -24, -25, -25, -25, -26, -26, -22, -20, -19, -17, -16, -16, -13, -12, -11, -10, -8, -7, -6, -4, -4, -2, -1, 1, 2, 4, 5, 6, 8, 8, 10, 12, 13, 14, 15, 17, 18, 20, 20, 20, 20, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 16, 15, 14, 12, 11, 10, 7, 5, 7, 7, 4, 2, -3, -7, -11, -15, -18, -20, -21, -21, -21, -20, -19, -17, -14, -7, -8, -12, -16, -18, -18, -17, -19, -15, -20, -25, -29, -31, -38, -41, -41, -44, -45, -47, -47, -47, -47, -46, -47, -48, -48, -49, -51, -53, -55, -57, -60, -63, -66, -69, -71, -72, -75, -77, -79, -83, -86, -89, -91, -92, -93, -97, -98, -99,-100,-101,-100, -98, -94, -92, -90, -87, -83, -78, -72, -68, -64, -59, -54, -47, -42, -36, -30, -26, -25, -17, -16, -3, 5, 8, 12, 15, 19, 22, 26, 29, 33, 36, 39, 42, 45, 48, 51, 53, 51, 57, 64, 64, 61, 61, 61, 62, 64, 62, 59, 64, 68, 69, 71, 71, 70, 72, 72, 74, 75, 74, 71, 71, 73, 76, 78, 78, 78, 78, 76, 74, 73, 70, 66, 63, 62, 62, 61, 60, 57, 54, 51, 49, 48, 46, 44, 42, 41, 40, 38, 37, 35, 33, 32, 30, 27, 28, 27, 25, 24, 23, 22, + /* -1.0 */ 21, 20, 20, 19, 19, 17, 17, 17, 16, 16, 16, 15, 14, 16, 15, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 15, 14, 14, 13, 12, 12, 11, 10, 9, 8, 7, 5, 4, 2, 1, -0, -2, -3, -5, -6, -7, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -22, -23, -22, -22, -22, -21, -21, -20, -19, -19, -18, -18, -17, -17, -17, -16, -16, -15, -14, -14, -13, -13, -12, -11, -11, -10, -10, -6, -4, -4, -3, -2, -1, 1, 4, 7, 9, 10, 16, 24, 23, 15, 17, 19, 20, 19, 17, 15, 14, 12, 8, 5, 2, -1, -3, -6, -8, -9, -12, -15, -18, -20, -21, -24, -24, -23, -24, -23, -25, -25, -25, -25, -24, -22, -22, -23, -22, -20, -18, -16, -14, -12, -10, -8, -6, -4, -2, -1, 1, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 13, 15, 17, 18, 18, 19, 19, 20, 20, 20, 20, 20, 19, 19, 18, 18, 18, 18, 18, 18, 17, 18, 17, 17, 16, 16, 14, 14, 12, 9, 8, 8, 6, 4, 0, -4, -8, -13, -15, -19, -21, -21, -21, -21, -20, -18, -16, -12, -7, -8, -12, -14, -17, -17, -15, -15, -16, -20, -24, -28, -31, -34, -40, -42, -43, -45, -48, -49, -48, -49, -48, -48, -49, -50, -51, -53, -54, -56, -59, -62, -64, -67, -70, -72, -74, -77, -78, -81, -85, -88, -91, -94, -93, -95, -99, -99,-100,-101,-102,-101,-100, -97, -95, -92, -88, -84, -79, -74, -67, -62, -59, -54, -47, -41, -35, -29, -27, -23, -17, -12, -0, 3, 8, 11, 15, 19, 22, 26, 30, 34, 37, 41, 45, 48, 50, 54, 54, 54, 55, 62, 61, 64, 61, 50, 44, 45, 55, 68, 71, 72, 74, 77, 79, 78, 75, 75, 72, 70, 69, 72, 73, 73, 73, 73, 73, 73, 72, 71, 69, 64, 62, 60, 60, 59, 60, 59, 58, 56, 53, 50, 48, 46, 44, 42, 41, 39, 39, 37, 35, 33, 32, 31, 28, 28, 28, 26, 24, 24, 22, 21, + /* 0.0 */ 21, 20, 20, 19, 19, 18, 17, 16, 15, 15, 15, 15, 15, 15, 14, 15, 16, 16, 16, 16, 16, 17, 16, 16, 17, 16, 15, 14, 14, 13, 13, 12, 11, 10, 9, 8, 6, 5, 3, 2, 1, -1, -2, -4, -6, -7, -8, -9, -11, -12, -13, -14, -16, -17, -18, -19, -20, -21, -22, -23, -23, -24, -24, -24, -24, -23, -23, -22, -22, -21, -20, -20, -19, -19, -18, -18, -17, -16, -16, -15, -14, -13, -13, -12, -11, -11, -10, -9, -8, -6, -4, -4, -3, -2, -0, 1, 3, 6, 10, 9, 14, 22, 25, 17, 18, 20, 21, 19, 19, 17, 14, 11, 7, 3, 0, -2, -5, -7, -8, -10, -13, -16, -19, -21, -23, -25, -26, -25, -24, -24, -26, -27, -26, -26, -25, -23, -25, -25, -23, -20, -19, -16, -14, -12, -10, -8, -7, -4, -2, 0, 2, 4, 6, 8, 9, 10, 10, 10, 11, 12, 13, 13, 15, 17, 18, 19, 19, 19, 19, 19, 19, 20, 19, 19, 19, 19, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 17, 16, 14, 12, 9, 9, 8, 6, 3, -1, -4, -8, -11, -15, -17, -19, -20, -21, -21, -19, -17, -15, -12, -7, -10, -12, -12, -14, -16, -16, -14, -12, -19, -23, -27, -30, -33, -35, -41, -43, -45, -48, -49, -50, -49, -49, -49, -50, -51, -52, -53, -55, -58, -60, -63, -66, -68, -71, -73, -75, -78, -80, -83, -86, -89, -92, -95, -95, -96,-100,-101,-102,-103,-103,-103,-102, -99, -94, -93, -89, -84, -79, -74, -69, -63, -58, -53, -47, -40, -34, -30, -29, -19, -13, -7, -2, 2, 6, 10, 14, 18, 22, 26, 30, 34, 37, 41, 45, 50, 54, 55, 55, 53, 54, 58, 61, 63, 56, 55, 51, 47, 69, 72, 74, 77, 76, 73, 74, 73, 72, 68, 68, 70, 71, 72, 72, 72, 72, 71, 69, 68, 66, 66, 62, 63, 61, 59, 58, 59, 59, 59, 56, 54, 52, 49, 47, 45, 44, 42, 41, 39, 38, 36, 34, 32, 31, 29, 28, 28, 25, 25, 23, 23, 22, 21, + /* 1.0 */ 19, 20, 19, 19, 18, 17, 17, 16, 15, 15, 15, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 16, 16, 15, 15, 14, 13, 12, 11, 11, 10, 8, 7, 6, 5, 3, 1, -0, -2, -4, -5, -7, -8, -9, -11, -12, -13, -15, -16, -17, -18, -19, -21, -22, -23, -24, -24, -25, -25, -25, -25, -25, -25, -24, -24, -23, -22, -21, -21, -20, -19, -19, -18, -17, -17, -16, -15, -14, -13, -13, -12, -11, -10, -9, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 6, 8, 10, 12, 18, 28, 24, 19, 20, 22, 21, 20, 17, 14, 10, 6, 2, 1, -1, -6, -8, -9, -11, -14, -17, -20, -23, -25, -26, -28, -28, -27, -26, -27, -28, -27, -26, -26, -28, -27, -25, -22, -20, -18, -15, -13, -11, -8, -6, -4, -1, 1, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 13, 12, 12, 15, 16, 17, 17, 17, 18, 19, 19, 20, 20, 19, 19, 18, 18, 18, 18, 17, 17, 17, 16, 16, 16, 16, 15, 16, 14, 13, 11, 11, 9, 7, 4, -0, -3, -6, -10, -13, -15, -18, -19, -19, -19, -18, -16, -14, -13, -11, -12, -13, -14, -14, -16, -12, -16, -14, -19, -24, -26, -29, -31, -33, -36, -42, -44, -47, -50, -51, -49, -50, -50, -51, -52, -53, -54, -56, -58, -61, -64, -66, -68, -71, -73, -76, -78, -81, -84, -88, -91, -94, -96, -96, -97,-100,-102,-103,-103,-103,-103,-102,-100, -96, -95, -91, -86, -80, -74, -68, -61, -58, -52, -47, -40, -35, -32, -26, -19, -12, -7, -3, 1, 4, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 50, 55, 58, 58, 58, 56, 56, 64, 65, 63, 67, 68, 58, 65, 71, 72, 73, 74, 74, 74, 73, 71, 71, 71, 71, 71, 71, 71, 71, 70, 69, 68, 67, 66, 66, 62, 62, 59, 58, 57, 57, 57, 57, 55, 53, 50, 48, 46, 45, 43, 42, 40, 39, 37, 35, 33, 31, 31, 28, 29, 26, 26, 24, 23, 21, 20, 19, + /* 2.0 */ 19, 19, 19, 18, 18, 17, 16, 15, 15, 14, 14, 14, 14, 14, 14, 15, 15, 16, 15, 16, 17, 17, 18, 18, 16, 15, 14, 14, 14, 13, 12, 11, 10, 9, 7, 6, 5, 4, 2, 0, -1, -3, -4, -6, -8, -9, -11, -12, -13, -14, -16, -17, -18, -20, -21, -22, -23, -24, -25, -26, -26, -27, -27, -27, -26, -26, -25, -25, -24, -23, -23, -22, -21, -20, -19, -18, -18, -17, -16, -15, -14, -13, -12, -10, -10, -9, -7, -6, -5, -4, -3, -2, -1, 0, 1, 3, 5, 7, 9, 11, 11, 13, 20, 26, 24, 20, 20, 20, 18, 14, 11, 8, 4, -0, -1, -4, -6, -9, -10, -12, -16, -19, -22, -24, -26, -28, -29, -29, -29, -28, -29, -29, -28, -30, -32, -29, -27, -24, -22, -20, -17, -15, -13, -10, -8, -5, -2, 0, 3, 5, 7, 7, 8, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 16, 18, 20, 20, 20, 19, 18, 18, 18, 19, 19, 18, 17, 17, 17, 17, 16, 16, 16, 15, 15, 16, 14, 13, 13, 12, 9, 7, 4, 0, -1, -3, -7, -10, -14, -16, -18, -16, -16, -15, -14, -13, -13, -11, -11, -13, -14, -14, -16, -15, -17, -16, -20, -23, -25, -28, -30, -30, -33, -36, -40, -46, -50, -51, -50, -50, -51, -52, -53, -54, -55, -56, -58, -61, -63, -66, -68, -71, -74, -76, -79, -81, -85, -89, -92, -95, -97, -97, -99,-100,-102,-104,-104,-104,-104,-103,-102, -99, -95, -90, -85, -80, -73, -66, -61, -56, -51, -47, -43, -39, -32, -27, -21, -10, -7, -4, -0, 4, 8, 12, 15, 20, 23, 26, 30, 34, 38, 41, 45, 53, 56, 58, 57, 54, 54, 59, 59, 60, 64, 70, 62, 56, 68, 69, 72, 74, 74, 74, 73, 72, 71, 70, 70, 70, 69, 70, 69, 68, 67, 66, 66, 65, 64, 62, 60, 57, 56, 56, 56, 56, 55, 54, 52, 50, 47, 46, 44, 42, 40, 39, 38, 36, 34, 32, 31, 30, 27, 28, 26, 25, 23, 21, 21, 20, 19, + /* 3.0 */ 19, 18, 18, 17, 17, 16, 16, 15, 14, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 17, 17, 16, 15, 14, 14, 12, 11, 10, 10, 9, 8, 7, 5, 4, 3, 1, -0, -2, -3, -5, -7, -9, -10, -11, -13, -14, -16, -17, -18, -20, -21, -22, -23, -25, -25, -26, -27, -28, -28, -28, -28, -28, -27, -26, -26, -25, -24, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -12, -11, -10, -9, -8, -7, -5, -4, -3, -2, -1, 0, 1, 2, 4, 5, 7, 10, 12, 13, 11, 15, 24, 27, 18, 18, 16, 12, 9, 6, 3, 1, -3, -6, -7, -6, -10, -13, -14, -17, -20, -23, -26, -28, -29, -30, -30, -30, -31, -31, -29, -29, -31, -31, -29, -27, -25, -23, -21, -18, -15, -12, -10, -7, -4, -2, 1, 4, 5, 6, 8, 8, 9, 10, 11, 11, 12, 13, 13, 15, 15, 15, 16, 17, 18, 18, 19, 20, 21, 20, 21, 20, 20, 20, 19, 18, 18, 18, 17, 17, 17, 16, 15, 14, 16, 17, 17, 16, 15, 15, 13, 11, 8, 6, 3, 1, -0, -3, -7, -10, -13, -14, -13, -12, -12, -11, -12, -12, -11, -11, -13, -14, -13, -13, -15, -17, -18, -20, -21, -24, -27, -29, -30, -31, -35, -37, -41, -47, -50, -50, -52, -51, -53, -53, -54, -56, -57, -59, -61, -63, -66, -68, -71, -73, -76, -79, -82, -86, -90, -93, -95, -98, -96, -99,-101,-103,-104,-103,-104,-104,-104,-102, -99, -95, -91, -85, -80, -74, -67, -60, -55, -51, -49, -44, -37, -31, -29, -19, -12, -9, -5, -1, 2, 5, 9, 13, 18, 21, 24, 28, 31, 35, 40, 45, 50, 54, 57, 55, 55, 57, 59, 62, 65, 68, 70, 67, 56, 62, 67, 73, 73, 74, 73, 72, 71, 70, 69, 69, 69, 68, 68, 68, 67, 66, 65, 64, 64, 63, 61, 57, 56, 54, 54, 55, 55, 54, 53, 50, 49, 47, 46, 43, 41, 40, 38, 36, 34, 32, 30, 30, 29, 26, 28, 25, 24, 22, 21, 20, 19, 19, + /* 4.0 */ 17, 17, 16, 16, 17, 16, 15, 14, 14, 14, 13, 13, 14, 13, 14, 14, 15, 16, 17, 16, 17, 17, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 7, 6, 5, 4, 3, 2, 0, -1, -3, -4, -6, -8, -10, -12, -13, -15, -16, -17, -19, -20, -21, -22, -23, -25, -26, -27, -28, -28, -29, -29, -29, -29, -29, -29, -28, -27, -27, -26, -25, -24, -23, -21, -20, -19, -18, -17, -16, -14, -13, -12, -11, -10, -9, -8, -7, -5, -4, -3, -2, -0, 1, 3, 4, 5, 7, 9, 10, 13, 14, 13, 10, 17, 27, 18, 19, 10, 6, 4, 2, -1, -3, -6, -7, -8, -9, -12, -14, -15, -18, -22, -24, -27, -31, -33, -33, -32, -33, -34, -32, -29, -30, -31, -32, -30, -28, -26, -23, -21, -18, -15, -13, -10, -7, -4, -1, 2, 4, 5, 6, 8, 9, 10, 10, 12, 12, 13, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 24, 25, 24, 23, 22, 21, 20, 20, 19, 18, 17, 16, 15, 17, 19, 21, 19, 18, 20, 16, 15, 14, 12, 10, 8, 5, 3, -3, -6, -8, -9, -10, -11, -11, -11, -11, -11, -11, -11, -12, -13, -13, -12, -11, -14, -16, -17, -16, -18, -22, -26, -30, -30, -31, -34, -37, -39, -43, -47, -49, -53, -54, -52, -53, -54, -55, -57, -59, -61, -63, -65, -67, -70, -73, -77, -80, -83, -87, -90, -93, -96, -98, -96,-100,-101,-103,-104,-104,-106,-106,-105,-103, -99, -95, -90, -86, -80, -73, -67, -60, -55, -51, -51, -44, -43, -33, -22, -20, -15, -11, -7, -2, 1, 3, 6, 10, 15, 19, 22, 25, 29, 33, 37, 42, 47, 52, 56, 55, 57, 59, 61, 63, 66, 68, 69, 70, 62, 65, 66, 71, 72, 72, 72, 71, 70, 69, 68, 67, 67, 67, 67, 67, 66, 65, 64, 63, 62, 62, 59, 57, 55, 53, 53, 54, 54, 52, 53, 49, 48, 47, 45, 41, 41, 38, 36, 34, 33, 31, 30, 28, 28, 25, 26, 24, 23, 21, 19, 19, 18, 17, + /* 5.0 */ 16, 16, 16, 16, 16, 15, 13, 13, 13, 13, 12, 12, 13, 13, 14, 14, 15, 16, 16, 17, 16, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 6, 5, 4, 3, 1, -0, -1, -3, -4, -6, -8, -10, -12, -13, -15, -16, -17, -19, -20, -21, -23, -24, -25, -26, -27, -28, -29, -30, -30, -30, -31, -31, -31, -30, -29, -29, -28, -27, -26, -24, -23, -22, -21, -19, -18, -17, -15, -14, -13, -11, -10, -9, -8, -7, -6, -5, -4, -3, -1, 0, 2, 4, 6, 6, 8, 9, 10, 12, 13, 14, 12, 16, 27, 23, 22, 13, 3, -0, -2, -5, -6, -5, -8, -9, -10, -15, -13, -14, -19, -24, -25, -27, -33, -34, -33, -34, -34, -34, -36, -35, -35, -34, -33, -31, -29, -26, -24, -21, -18, -16, -13, -10, -7, -4, -1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 17, 17, 17, 18, 19, 20, 20, 21, 23, 23, 27, 30, 30, 29, 27, 26, 24, 25, 24, 22, 20, 20, 17, 16, 18, 21, 19, 19, 20, 21, 20, 18, 16, 14, 12, 9, 6, 4, -1, -5, -8, -8, -7, -9, -9, -10, -11, -12, -11, -11, -11, -12, -13, -13, -13, -13, -15, -14, -15, -17, -21, -24, -29, -30, -31, -34, -36, -39, -41, -46, -49, -53, -54, -54, -53, -54, -55, -56, -57, -60, -62, -64, -66, -70, -74, -78, -81, -84, -88, -91, -94, -96, -97, -96,-100,-101,-102,-103,-105,-107,-106,-105,-103, -99, -95, -90, -86, -80, -73, -67, -60, -54, -52, -50, -49, -42, -29, -26, -21, -17, -13, -8, -3, -1, 0, 3, 8, 12, 17, 20, 23, 27, 31, 34, 39, 44, 49, 54, 57, 59, 62, 62, 64, 66, 67, 64, 65, 53, 56, 68, 70, 69, 70, 71, 69, 68, 68, 67, 67, 66, 66, 65, 66, 65, 64, 63, 62, 61, 61, 59, 55, 54, 53, 52, 54, 52, 51, 51, 49, 47, 45, 43, 40, 40, 36, 34, 33, 30, 30, 29, 28, 27, 25, 24, 23, 22, 21, 18, 18, 17, 16, + /* 6.0 */ 16, 16, 16, 16, 15, 13, 12, 11, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 16, 16, 15, 14, 13, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 1, 0, -1, -3, -5, -6, -8, -10, -11, -13, -15, -16, -18, -19, -20, -22, -23, -24, -25, -27, -28, -29, -30, -31, -31, -32, -32, -32, -32, -32, -31, -31, -30, -29, -28, -26, -25, -24, -23, -21, -20, -18, -17, -15, -14, -12, -11, -10, -9, -8, -6, -5, -4, -3, -2, -1, 1, 3, 4, 6, 8, 9, 10, 13, 13, 14, 14, 12, 19, 26, 20, 13, 20, 6, -3, -5, -7, -10, -8, -6, -7, -13, -17, -16, -19, -23, -26, -27, -28, -32, -32, -32, -33, -33, -36, -38, -38, -38, -36, -34, -32, -30, -27, -24, -22, -19, -16, -13, -10, -7, -4, -1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 18, 18, 19, 20, 21, 22, 23, 25, 28, 30, 31, 31, 29, 29, 27, 27, 28, 27, 27, 26, 25, 21, 19, 19, 20, 19, 20, 21, 22, 23, 20, 18, 15, 12, 10, 8, 5, 1, -3, -6, -6, -6, -7, -8, -9, -11, -11, -10, -10, -11, -12, -13, -13, -13, -13, -13, -13, -13, -14, -18, -23, -26, -29, -30, -32, -34, -37, -40, -42, -49, -52, -53, -55, -54, -54, -54, -55, -57, -58, -60, -62, -66, -70, -74, -78, -82, -85, -88, -91, -94, -96, -97, -97,-100,-101,-102,-102,-104,-105,-100, -98,-100, -98, -95, -90, -85, -79, -73, -67, -60, -55, -55, -54, -52, -40, -34, -30, -23, -19, -15, -10, -7, -5, -3, 0, 6, 10, 14, 17, 21, 24, 28, 31, 35, 42, 47, 53, 53, 56, 60, 67, 65, 66, 67, 70, 64, 45, 60, 68, 68, 67, 67, 69, 66, 66, 67, 66, 66, 65, 64, 64, 64, 64, 63, 63, 61, 60, 59, 58, 57, 53, 53, 52, 52, 50, 49, 50, 48, 45, 43, 41, 38, 36, 35, 32, 31, 29, 29, 28, 28, 25, 27, 24, 23, 21, 21, 18, 18, 16, 16, + /* 7.0 */ 16, 15, 15, 15, 14, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, -0, -1, -3, -5, -6, -8, -10, -11, -13, -15, -16, -18, -20, -21, -23, -24, -25, -27, -28, -29, -30, -31, -32, -32, -33, -33, -34, -33, -34, -33, -33, -32, -31, -30, -29, -27, -26, -25, -23, -22, -20, -18, -16, -15, -13, -12, -10, -9, -8, -7, -6, -5, -3, -2, -1, 0, 1, 3, 5, 6, 8, 11, 11, 12, 12, 12, 12, 14, 17, 22, 14, 4, 11, 3, -5, -7, -8, -10, -12, -10, -12, -16, -21, -24, -26, -27, -29, -30, -31, -32, -33, -33, -34, -39, -40, -40, -40, -39, -38, -35, -32, -30, -28, -25, -22, -19, -16, -13, -10, -7, -4, -1, 1, 3, 4, 6, 7, 9, 10, 12, 13, 14, 15, 17, 17, 18, 19, 19, 20, 21, 22, 23, 27, 31, 31, 31, 32, 31, 30, 30, 28, 28, 28, 28, 27, 26, 27, 26, 25, 24, 23, 22, 22, 22, 21, 20, 20, 19, 17, 15, 12, 8, 6, 3, -0, -2, -3, -3, -5, -6, -9, -9, -8, -8, -10, -11, -11, -12, -13, -12, -12, -11, -11, -11, -11, -14, -19, -23, -25, -26, -28, -31, -33, -36, -39, -44, -51, -53, -54, -56, -54, -53, -54, -56, -57, -59, -62, -66, -70, -74, -78, -82, -85, -89, -91, -94, -96, -97, -97,-100,-100,-101,-101,-103,-103, -97, -93, -95, -96, -94, -90, -85, -79, -74, -67, -60, -56, -58, -59, -50, -42, -35, -31, -25, -21, -17, -14, -12, -9, -5, -2, 3, 7, 11, 15, 18, 22, 26, 31, 33, 36, 44, 48, 52, 53, 55, 59, 67, 66, 69, 71, 62, 51, 62, 67, 67, 66, 66, 67, 68, 63, 63, 61, 64, 64, 63, 63, 63, 63, 62, 61, 60, 59, 58, 58, 53, 52, 55, 52, 50, 50, 48, 46, 49, 43, 41, 39, 37, 35, 33, 32, 30, 28, 26, 27, 26, 26, 26, 23, 22, 21, 19, 18, 17, 16, 16, + /* 8.0 */ 15, 14, 13, 13, 12, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 15, 14, 14, 13, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 2, 1, -0, -1, -3, -4, -6, -8, -9, -11, -13, -14, -16, -18, -19, -22, -23, -25, -26, -27, -29, -30, -31, -32, -33, -34, -35, -35, -35, -35, -35, -35, -35, -34, -33, -32, -31, -29, -28, -27, -25, -23, -22, -20, -18, -16, -15, -13, -12, -10, -9, -8, -6, -5, -4, -3, -2, -0, 1, 2, 4, 5, 7, 9, 11, 12, 14, 15, 15, 15, 15, 12, 9, 4, 2, 4, 0, -5, -9, -10, -11, -13, -14, -18, -21, -25, -27, -29, -30, -31, -33, -35, -37, -38, -37, -39, -43, -43, -42, -42, -40, -37, -35, -32, -30, -28, -25, -21, -18, -15, -12, -10, -7, -5, -3, -2, -0, 2, 4, 6, 7, 9, 10, 12, 13, 15, 17, 19, 19, 19, 20, 21, 23, 24, 31, 33, 30, 32, 34, 35, 34, 31, 30, 29, 27, 28, 27, 26, 26, 26, 26, 26, 25, 25, 24, 24, 22, 21, 20, 19, 18, 16, 14, 12, 9, 6, 4, 2, -1, -1, -2, -3, -5, -5, -6, -7, -7, -9, -10, -10, -11, -12, -12, -10, -8, -8, -9, -11, -12, -16, -19, -21, -22, -25, -28, -29, -31, -34, -39, -47, -52, -53, -54, -55, -52, -53, -54, -55, -58, -62, -66, -70, -74, -78, -81, -85, -88, -91, -93, -95, -96, -97, -99,-100,-100, -97, -99,-100, -96, -94, -95, -95, -92, -88, -84, -78, -73, -67, -62, -58, -58, -60, -49, -43, -36, -32, -27, -23, -19, -17, -14, -11, -7, -3, -0, 4, 8, 13, 16, 20, 25, 29, 33, 36, 38, 46, 50, 52, 54, 56, 60, 67, 71, 71, 65, 55, 61, 65, 64, 64, 64, 64, 64, 63, 63, 65, 58, 63, 63, 62, 61, 62, 59, 60, 60, 59, 59, 58, 52, 50, 52, 49, 48, 49, 46, 44, 42, 41, 39, 37, 35, 33, 31, 30, 29, 28, 28, 27, 25, 26, 23, 22, 22, 20, 19, 18, 16, 16, 15, + /* 9.0 */ 14, 13, 13, 12, 11, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 13, 12, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, -0, -1, -3, -4, -6, -7, -9, -11, -12, -14, -15, -17, -19, -21, -23, -25, -26, -28, -29, -31, -32, -33, -34, -35, -36, -37, -37, -37, -37, -37, -37, -36, -35, -34, -33, -32, -30, -29, -27, -25, -23, -22, -20, -18, -16, -15, -13, -12, -10, -9, -8, -6, -5, -3, -2, -1, 0, 1, 3, 4, 6, 6, 7, 10, 15, 13, 11, 12, 14, 10, 1, 2, -2, -2, -2, -11, -5, -8, -12, -13, -15, -18, -23, -29, -33, -35, -34, -33, -36, -40, -40, -42, -44, -42, -44, -44, -43, -42, -41, -39, -37, -35, -33, -30, -26, -23, -20, -16, -14, -12, -10, -8, -6, -4, -3, -1, 1, 3, 5, 7, 8, 10, 12, 13, 15, 16, 19, 20, 19, 21, 23, 25, 29, 32, 32, 30, 33, 34, 35, 34, 31, 29, 28, 27, 27, 26, 25, 24, 24, 25, 25, 24, 24, 25, 25, 23, 23, 21, 19, 19, 16, 14, 12, 9, 6, 4, 1, -1, -1, -1, -1, -2, -3, -4, -5, -6, -7, -8, -8, -9, -10, -8, -4, -7, -7, -7, -8, -12, -12, -14, -17, -18, -22, -25, -27, -28, -30, -34, -42, -49, -51, -52, -53, -51, -51, -53, -55, -58, -62, -66, -70, -74, -77, -80, -84, -87, -90, -92, -94, -95, -96, -98, -99, -96, -96, -97, -97, -96, -95, -98, -95, -92, -88, -84, -78, -73, -67, -62, -61, -59, -61, -51, -44, -39, -34, -29, -25, -22, -20, -17, -13, -9, -6, -3, 2, 6, 10, 13, 18, 23, 26, 31, 35, 38, 42, 49, 49, 54, 55, 53, 60, 64, 68, 68, 51, 60, 62, 62, 61, 61, 62, 61, 62, 62, 62, 59, 61, 60, 61, 60, 57, 55, 56, 56, 54, 54, 51, 56, 47, 51, 46, 43, 43, 43, 42, 40, 38, 35, 35, 34, 32, 30, 29, 30, 29, 28, 25, 28, 26, 22, 22, 20, 19, 18, 18, 16, 15, 14, + /* 10.0 */ 13, 12, 12, 11, 10, 10, 10, 10, 11, 12, 12, 12, 12, 13, 13, 15, 13, 13, 12, 11, 10, 10, 9, 8, 7, 6, 5, 5, 3, 2, 1, 0, -1, -2, -3, -4, -5, -7, -8, -10, -11, -13, -15, -17, -19, -21, -23, -24, -26, -28, -29, -31, -32, -34, -35, -36, -37, -38, -38, -39, -39, -39, -39, -39, -38, -37, -36, -34, -33, -31, -29, -27, -26, -24, -22, -20, -18, -16, -15, -13, -12, -10, -9, -7, -6, -5, -3, -2, -1, 0, 1, 3, 4, 4, 6, 10, 14, 9, 6, 3, 1, 1, -2, -4, -3, -5, -4, -1, -13, -14, -11, -13, -16, -17, -23, -28, -32, -40, -45, -43, -42, -41, -42, -44, -46, -45, -45, -45, -45, -44, -43, -41, -39, -37, -35, -32, -29, -26, -22, -19, -16, -15, -13, -11, -9, -7, -5, -3, -1, 1, 3, 5, 6, 8, 10, 11, 13, 14, 16, 16, 17, 19, 21, 25, 29, 30, 31, 33, 32, 33, 33, 32, 32, 30, 28, 28, 27, 26, 25, 24, 23, 22, 24, 24, 23, 23, 24, 25, 24, 24, 22, 19, 18, 17, 15, 13, 10, 8, 6, 4, 2, 0, -0, -0, -0, -1, -2, -3, -5, -6, -5, -6, -7, -8, -4, -4, -5, -6, -7, -8, -10, -12, -13, -15, -18, -20, -23, -25, -26, -28, -32, -37, -44, -48, -50, -51, -50, -50, -51, -54, -58, -62, -66, -70, -72, -76, -79, -83, -85, -88, -91, -93, -94, -95, -97, -97, -95, -95, -95, -95, -96, -98, -97, -95, -91, -88, -84, -79, -74, -68, -63, -63, -61, -64, -53, -46, -42, -36, -32, -28, -25, -23, -19, -16, -12, -9, -5, -1, 3, 8, 11, 15, 19, 24, 29, 32, 37, 40, 45, 50, 52, 56, 54, 62, 65, 65, 64, 50, 59, 60, 59, 59, 58, 58, 59, 60, 60, 60, 60, 55, 61, 56, 54, 52, 53, 55, 53, 51, 51, 46, 45, 44, 44, 42, 41, 41, 40, 39, 38, 36, 35, 36, 33, 32, 30, 28, 28, 26, 25, 26, 25, 23, 22, 21, 20, 19, 18, 16, 15, 14, 13, + /* 11.0 */ 12, 11, 11, 11, 11, 11, 11, 10, 11, 10, 12, 12, 12, 13, 13, 13, 13, 12, 11, 10, 9, 8, 8, 6, 6, 5, 4, 3, 2, 0, -1, -1, -2, -3, -4, -5, -6, -8, -9, -11, -12, -15, -16, -18, -20, -22, -24, -26, -28, -29, -31, -32, -34, -35, -37, -38, -39, -40, -40, -41, -41, -41, -41, -40, -39, -38, -37, -35, -34, -32, -30, -28, -26, -24, -22, -20, -18, -16, -14, -13, -11, -10, -9, -7, -6, -5, -3, -2, -0, 1, 2, 3, 1, -1, 6, 8, 9, 6, 3, 1, -1, -2, -4, -6, -9, -9, 0, -5, -13, -17, -17, -17, -22, -23, -26, -30, -30, -33, -39, -42, -46, -45, -45, -47, -47, -46, -45, -45, -45, -44, -43, -41, -39, -37, -35, -31, -27, -25, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -2, 0, 2, 4, 7, 9, 10, 12, 14, 15, 16, 16, 17, 19, 20, 26, 28, 29, 31, 32, 35, 34, 32, 32, 31, 29, 29, 29, 28, 26, 25, 24, 23, 23, 22, 23, 22, 21, 22, 22, 22, 22, 21, 19, 18, 16, 15, 13, 11, 10, 8, 6, 4, 3, 3, 2, 2, 0, -1, -2, -3, -3, -2, -3, -5, -5, -4, -5, -5, -3, -6, -7, -9, -11, -12, -13, -17, -20, -21, -24, -25, -28, -28, -33, -40, -44, -47, -48, -48, -49, -52, -54, -58, -62, -65, -68, -71, -75, -78, -81, -84, -87, -90, -91, -92, -93, -95, -94, -92, -94, -94, -93, -93, -99, -96, -93, -90, -88, -84, -79, -74, -68, -64, -63, -61, -63, -53, -48, -44, -38, -34, -30, -28, -25, -22, -18, -15, -12, -8, -3, 1, 6, 9, 12, 16, 20, 25, 30, 35, 39, 42, 48, 52, 54, 55, 60, 62, 65, 55, 52, 57, 58, 57, 56, 56, 56, 56, 58, 58, 58, 59, 50, 51, 43, 38, 41, 46, 51, 50, 50, 47, 46, 44, 43, 42, 41, 40, 39, 37, 39, 36, 34, 34, 33, 32, 29, 29, 27, 27, 28, 26, 23, 25, 22, 21, 20, 19, 17, 16, 15, 14, 13, 12, + /* 12.0 */ 11, 10, 11, 11, 11, 11, 10, 11, 11, 10, 11, 12, 12, 12, 12, 12, 11, 10, 10, 9, 8, 8, 6, 5, 5, 4, 3, 2, 0, -1, -2, -2, -3, -4, -5, -6, -8, -9, -10, -12, -13, -15, -18, -19, -21, -23, -25, -27, -29, -31, -32, -34, -35, -37, -38, -39, -40, -41, -42, -42, -42, -42, -42, -41, -40, -39, -38, -36, -35, -33, -31, -29, -27, -25, -22, -20, -18, -16, -14, -12, -10, -9, -8, -7, -6, -5, -3, -2, -1, -0, -2, -3, -2, -0, 6, 9, 7, 6, 3, 3, 0, -2, -4, -6, -10, -16, -20, -18, -16, -22, -23, -25, -26, -30, -34, -36, -32, -38, -38, -43, -49, -49, -45, -48, -47, -46, -45, -45, -44, -43, -42, -41, -38, -35, -32, -29, -26, -24, -22, -20, -19, -17, -15, -13, -11, -9, -6, -4, -2, 1, 3, 6, 8, 10, 12, 14, 15, 15, 16, 18, 19, 20, 21, 27, 28, 29, 30, 30, 33, 33, 33, 32, 31, 29, 29, 29, 28, 27, 26, 25, 24, 24, 22, 22, 20, 20, 21, 21, 22, 21, 21, 19, 17, 16, 14, 13, 12, 11, 8, 7, 5, 5, 5, 5, 4, 3, 1, -0, -0, -0, -1, -1, -3, -4, -5, -5, -4, -2, -2, -3, -8, -9, -10, -12, -15, -17, -19, -21, -23, -26, -28, -30, -34, -37, -41, -43, -45, -46, -51, -54, -57, -60, -63, -67, -70, -73, -76, -79, -82, -85, -88, -89, -90, -92, -93, -91, -90, -89, -91, -91, -93, -96, -95, -92, -89, -87, -83, -79, -74, -69, -64, -63, -62, -62, -54, -49, -46, -39, -36, -32, -29, -27, -24, -20, -17, -14, -10, -5, 1, 4, 6, 9, 13, 18, 22, 27, 31, 36, 38, 43, 49, 51, 52, 55, 58, 60, 47, 52, 55, 55, 55, 54, 54, 54, 54, 55, 56, 56, 56, 54, 53, 48, 46, 48, 38, 35, 42, 47, 47, 46, 45, 43, 41, 40, 39, 38, 36, 34, 33, 33, 32, 30, 31, 28, 27, 30, 26, 26, 23, 23, 22, 20, 19, 18, 17, 16, 14, 14, 13, 12, 11, + /* 13.0 */ 10, 10, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 11, 11, 10, 8, 8, 7, 6, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -4, -5, -6, -7, -9, -10, -11, -13, -14, -16, -18, -20, -22, -24, -26, -28, -30, -32, -34, -35, -37, -38, -39, -41, -42, -43, -43, -43, -43, -43, -43, -42, -41, -40, -39, -37, -35, -33, -31, -30, -28, -25, -23, -20, -18, -16, -14, -12, -11, -9, -8, -7, -6, -5, -4, -4, -6, -5, -3, -1, -0, 4, 7, 7, 6, 5, 2, 0, -2, -4, -6, -8, -11, -17, -22, -24, -26, -26, -30, -35, -38, -40, -40, -37, -35, -38, -42, -39, -48, -48, -46, -47, -46, -46, -45, -44, -44, -43, -41, -40, -37, -34, -31, -27, -25, -24, -22, -20, -18, -17, -15, -13, -11, -9, -6, -3, -1, 2, 4, 7, 9, 11, 13, 14, 16, 16, 17, 19, 20, 21, 23, 29, 30, 31, 31, 31, 31, 31, 32, 33, 31, 29, 28, 28, 28, 27, 26, 26, 25, 24, 23, 22, 21, 20, 19, 20, 21, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 7, 7, 8, 6, 4, 2, 2, 2, 1, -1, -2, -2, -4, -4, -3, -3, -1, -2, -5, -8, -9, -11, -11, -15, -18, -19, -21, -23, -26, -28, -31, -34, -37, -40, -42, -44, -47, -52, -57, -59, -62, -65, -68, -71, -74, -77, -80, -83, -86, -87, -88, -89, -89, -91, -88, -86, -87, -89, -92, -93, -92, -90, -87, -86, -82, -78, -73, -69, -65, -62, -62, -61, -57, -50, -47, -41, -38, -34, -32, -29, -25, -22, -20, -16, -12, -7, -2, 1, 3, 6, 11, 15, 19, 24, 28, 32, 36, 38, 38, 47, 50, 51, 53, 46, 45, 51, 53, 53, 52, 52, 52, 52, 52, 54, 54, 55, 55, 54, 53, 52, 53, 54, 53, 46, 32, 40, 47, 46, 44, 42, 41, 39, 38, 36, 34, 35, 32, 31, 30, 30, 29, 28, 26, 26, 24, 22, 21, 20, 20, 18, 17, 16, 15, 14, 14, 13, 12, 12, 10, + /* 14.0 */ 9, 10, 10, 10, 9, 9, 9, 9, 9, 9, 10, 11, 11, 11, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, -0, -2, -3, -3, -4, -4, -5, -6, -7, -8, -10, -11, -12, -14, -15, -17, -19, -21, -23, -25, -27, -29, -32, -33, -35, -36, -38, -39, -40, -42, -43, -44, -44, -44, -44, -44, -44, -43, -42, -41, -39, -37, -36, -34, -32, -30, -28, -25, -23, -21, -18, -16, -14, -13, -11, -9, -8, -7, -6, -6, -9, -7, -4, -3, 0, 3, 4, 5, 6, 6, 3, 2, 1, -1, -3, -6, -8, -12, -15, -18, -21, -23, -25, -29, -33, -35, -36, -37, -37, -37, -37, -38, -41, -39, -47, -53, -49, -48, -48, -47, -46, -44, -43, -42, -41, -38, -35, -32, -29, -26, -25, -23, -21, -20, -18, -16, -14, -11, -9, -7, -5, -2, 0, 3, 6, 8, 10, 13, 15, 17, 18, 18, 19, 20, 21, 24, 26, 29, 30, 30, 31, 32, 30, 31, 31, 31, 30, 29, 29, 28, 29, 27, 25, 25, 24, 23, 23, 22, 21, 20, 19, 19, 20, 20, 20, 19, 17, 15, 14, 14, 13, 11, 10, 9, 8, 8, 10, 9, 9, 7, 5, 4, 4, 3, 2, 1, -0, -1, -2, -2, -3, -5, -5, -2, -4, -6, -8, -10, -8, -10, -14, -17, -19, -22, -24, -26, -29, -31, -34, -36, -39, -41, -45, -51, -54, -58, -60, -63, -66, -69, -72, -75, -78, -81, -83, -84, -86, -87, -86, -88, -86, -85, -87, -89, -90, -92, -91, -88, -86, -86, -80, -77, -73, -69, -65, -62, -62, -60, -59, -51, -46, -42, -38, -35, -33, -30, -27, -24, -21, -18, -14, -9, -4, -2, -0, 3, 8, 12, 17, 21, 26, 30, 34, 34, 36, 44, 48, 50, 52, 44, 46, 50, 50, 50, 50, 50, 50, 50, 51, 52, 52, 53, 53, 53, 53, 53, 53, 54, 55, 55, 43, 32, 43, 44, 43, 42, 40, 38, 37, 34, 36, 34, 31, 30, 29, 30, 27, 26, 27, 24, 24, 24, 22, 19, 18, 17, 16, 14, 14, 14, 14, 12, 11, 9, 9, + /* 15.0 */ 9, 9, 8, 9, 8, 8, 8, 8, 8, 9, 8, 10, 10, 11, 10, 10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1, -1, -2, -3, -4, -4, -5, -6, -8, -9, -10, -12, -13, -14, -15, -17, -18, -20, -22, -24, -26, -28, -31, -33, -35, -36, -38, -39, -40, -41, -42, -44, -44, -45, -45, -45, -45, -44, -44, -42, -41, -39, -38, -36, -34, -32, -31, -29, -26, -23, -21, -19, -17, -15, -13, -11, -10, -9, -9, -9, -10, -5, -5, 1, 4, 2, 2, 2, 4, 4, 3, 1, -1, -1, -3, -6, -8, -10, -14, -15, -18, -21, -21, -24, -28, -30, -32, -35, -37, -38, -40, -39, -40, -42, -40, -55, -56, -49, -50, -49, -49, -47, -44, -43, -41, -38, -36, -33, -31, -28, -26, -25, -23, -21, -19, -17, -15, -13, -10, -8, -5, -3, -0, 3, 5, 8, 10, 13, 15, 18, 20, 25, 25, 21, 22, 23, 25, 28, 30, 29, 31, 32, 33, 29, 30, 30, 30, 29, 28, 28, 28, 29, 28, 26, 24, 22, 22, 23, 22, 21, 21, 20, 19, 19, 20, 20, 19, 17, 15, 15, 14, 13, 12, 10, 10, 10, 9, 11, 11, 10, 9, 7, 7, 6, 5, 4, 3, 2, 0, 0, 0, -1, -3, -3, 1, -4, -6, -7, -9, -5, -8, -12, -15, -16, -18, -21, -24, -27, -29, -32, -34, -37, -40, -45, -50, -54, -57, -58, -61, -64, -67, -70, -73, -76, -79, -81, -82, -84, -83, -84, -83, -84, -85, -87, -88, -87, -88, -89, -87, -84, -83, -79, -76, -72, -69, -64, -61, -60, -62, -56, -50, -47, -43, -39, -36, -34, -31, -29, -27, -24, -21, -17, -12, -7, -5, -3, 2, 6, 9, 14, 18, 23, 27, 31, 32, 41, 43, 41, 42, 44, 42, 45, 47, 47, 48, 48, 48, 48, 49, 49, 50, 51, 51, 52, 52, 52, 52, 52, 54, 55, 55, 50, 37, 40, 43, 44, 42, 40, 38, 36, 35, 31, 30, 29, 29, 29, 28, 25, 26, 24, 23, 22, 19, 18, 19, 16, 15, 14, 13, 13, 12, 12, 11, 10, 9, 9, + /* 16.0 */ 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 10, 10, 10, 9, 10, 9, 8, 8, 7, 6, 5, 4, 4, 4, 3, 1, -0, -2, -3, -4, -5, -6, -7, -8, -10, -11, -13, -14, -16, -17, -19, -21, -22, -24, -26, -27, -29, -32, -34, -35, -37, -39, -40, -41, -42, -43, -44, -45, -45, -46, -46, -45, -45, -44, -43, -42, -40, -38, -36, -34, -33, -31, -29, -26, -24, -21, -19, -17, -15, -15, -14, -12, -8, -3, -3, -8, -6, -2, -2, -3, -2, -1, -3, -2, -0, -1, -2, -2, -4, -5, -7, -10, -13, -15, -17, -19, -23, -25, -27, -29, -31, -34, -37, -39, -41, -42, -42, -41, -41, -42, -61, -55, -49, -46, -46, -47, -46, -44, -42, -40, -38, -34, -32, -29, -27, -25, -24, -22, -20, -18, -16, -14, -11, -8, -5, -3, -1, 3, 5, 8, 10, 13, 15, 17, 19, 21, 23, 31, 25, 24, 25, 26, 27, 30, 30, 32, 33, 32, 28, 28, 29, 29, 28, 28, 28, 28, 29, 29, 28, 27, 24, 23, 24, 23, 21, 22, 21, 21, 21, 21, 21, 19, 17, 17, 15, 14, 13, 12, 11, 10, 11, 11, 11, 12, 11, 10, 9, 8, 7, 6, 5, 5, 3, 2, 2, 1, 0, 0, 1, -1, -3, -4, -5, -6, -5, -9, -12, -15, -17, -19, -21, -23, -26, -29, -31, -33, -36, -40, -44, -47, -52, -56, -56, -59, -62, -65, -67, -70, -74, -75, -78, -80, -80, -80, -80, -80, -81, -83, -85, -85, -83, -81, -82, -84, -83, -81, -78, -75, -72, -68, -64, -61, -60, -61, -56, -51, -47, -44, -40, -37, -35, -32, -31, -30, -27, -23, -19, -14, -12, -9, -6, -1, 4, 7, 13, 16, 20, 24, 29, 31, 41, 43, 38, 33, 41, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 49, 49, 50, 51, 51, 51, 52, 52, 53, 54, 54, 53, 40, 36, 43, 42, 41, 41, 37, 35, 36, 31, 30, 29, 28, 28, 25, 24, 26, 23, 22, 20, 20, 18, 17, 16, 15, 13, 12, 12, 11, 11, 10, 9, 8, 7, + /* 17.0 */ 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 9, 9, 8, 8, 7, 6, 6, 6, 5, 5, 5, 4, 2, 0, -1, -3, -4, -5, -7, -8, -9, -10, -12, -14, -15, -17, -19, -21, -22, -23, -25, -27, -29, -31, -33, -35, -36, -38, -39, -40, -42, -43, -44, -45, -45, -46, -46, -46, -46, -45, -44, -44, -42, -40, -39, -37, -35, -33, -31, -30, -27, -24, -22, -20, -20, -19, -14, -8, -5, -3, -2, -6, -9, -7, -5, -5, -6, -5, -4, -5, -9, -9, -8, -6, -6, -7, -8, -10, -12, -14, -17, -19, -21, -25, -29, -30, -33, -38, -41, -43, -44, -45, -45, -43, -42, -41, -56, -62, -53, -49, -49, -48, -47, -44, -42, -41, -39, -36, -34, -31, -28, -25, -24, -22, -21, -19, -17, -15, -13, -10, -7, -4, -1, 2, 5, 8, 10, 13, 15, 16, 18, 21, 29, 25, 27, 25, 25, 26, 27, 27, 30, 32, 32, 34, 30, 27, 27, 28, 28, 28, 28, 28, 27, 28, 29, 28, 28, 27, 26, 25, 24, 22, 23, 22, 22, 22, 24, 23, 21, 20, 19, 17, 15, 14, 13, 11, 10, 11, 11, 12, 13, 12, 11, 10, 10, 8, 8, 7, 5, 4, 4, 3, 3, 2, 1, 0, -1, -2, -3, -4, -4, -4, -8, -12, -16, -20, -22, -23, -24, -25, -28, -32, -34, -36, -39, -42, -44, -50, -55, -55, -56, -59, -62, -64, -69, -71, -72, -75, -77, -76, -77, -78, -77, -78, -79, -79, -80, -80, -77, -75, -78, -80, -80, -77, -73, -71, -67, -63, -61, -60, -60, -58, -51, -48, -44, -41, -38, -37, -33, -32, -30, -27, -25, -20, -17, -15, -11, -8, -5, 1, 4, 8, 12, 16, 21, 25, 28, 34, 43, 41, 33, 40, 43, 42, 42, 43, 43, 44, 44, 44, 44, 45, 47, 48, 49, 50, 50, 51, 51, 51, 52, 53, 52, 49, 38, 31, 40, 44, 40, 41, 37, 37, 32, 31, 30, 28, 27, 26, 24, 23, 24, 21, 20, 19, 18, 17, 16, 14, 13, 12, 11, 11, 10, 9, 9, 8, 7, 7, + /* 18.0 */ 6, 6, 6, 7, 8, 9, 9, 8, 9, 9, 9, 10, 9, 9, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 3, 1, -1, -2, -3, -5, -6, -7, -8, -10, -11, -13, -15, -16, -18, -20, -22, -23, -25, -26, -28, -30, -32, -34, -36, -37, -39, -40, -41, -42, -43, -44, -45, -46, -46, -47, -47, -46, -46, -45, -44, -42, -41, -39, -37, -35, -33, -32, -30, -28, -25, -23, -23, -18, -14, -9, -7, -6, -4, -6, -12, -11, -13, -11, -10, -8, -7, -6, -8, -11, -11, -12, -12, -13, -11, -12, -15, -16, -15, -15, -20, -23, -25, -28, -29, -34, -38, -41, -45, -42, -42, -45, -46, -43, -49, -62, -58, -51, -48, -47, -45, -44, -42, -41, -39, -38, -35, -33, -30, -27, -24, -23, -21, -19, -18, -16, -14, -12, -9, -6, -3, -0, 3, 6, 9, 12, 14, 16, 18, 20, 22, 24, 25, 25, 26, 27, 26, 26, 26, 28, 33, 32, 35, 31, 30, 29, 28, 28, 28, 27, 27, 27, 27, 27, 29, 29, 29, 28, 27, 26, 24, 23, 23, 23, 24, 27, 25, 23, 22, 20, 18, 16, 15, 15, 13, 12, 12, 11, 11, 12, 13, 12, 11, 11, 9, 8, 7, 6, 6, 5, 4, 4, 4, 3, 0, -1, -1, -2, -2, -0, -4, -9, -14, -18, -22, -25, -27, -28, -29, -32, -34, -34, -35, -36, -40, -44, -48, -54, -53, -54, -56, -58, -62, -66, -66, -69, -72, -70, -71, -75, -74, -75, -75, -75, -75, -75, -75, -75, -72, -70, -72, -76, -74, -71, -69, -67, -63, -60, -59, -59, -55, -50, -48, -44, -42, -39, -37, -34, -32, -32, -30, -25, -21, -19, -16, -13, -8, -6, -4, 1, 5, 9, 13, 18, 22, 25, 31, 39, 37, 31, 36, 38, 40, 40, 41, 41, 41, 42, 42, 43, 43, 45, 46, 47, 48, 49, 50, 50, 50, 52, 51, 50, 44, 37, 31, 39, 41, 43, 38, 36, 33, 32, 30, 28, 26, 25, 24, 22, 21, 21, 20, 19, 18, 18, 16, 14, 12, 15, 12, 11, 10, 9, 8, 7, 7, 6, 6, + /* 19.0 */ 5, 5, 5, 5, 6, 7, 8, 9, 8, 10, 9, 10, 9, 9, 8, 8, 8, 8, 7, 8, 7, 7, 7, 6, 13, 8, -2, -2, -3, -5, -7, -8, -9, -10, -12, -14, -16, -17, -19, -21, -22, -24, -25, -27, -29, -31, -33, -35, -36, -38, -39, -40, -42, -43, -44, -44, -46, -46, -47, -47, -47, -47, -46, -45, -44, -43, -41, -39, -37, -35, -34, -32, -30, -28, -28, -25, -19, -16, -13, -11, -7, -5, -4, -6, -13, -13, -14, -12, -11, -10, -9, -7, -7, -12, -12, -14, -13, -14, -16, -16, -20, -22, -24, -26, -27, -27, -27, -28, -27, -29, -36, -44, -55, -62, -61, -55, -55, -61, -62, -57, -52, -48, -48, -47, -45, -43, -41, -40, -39, -37, -34, -32, -29, -25, -23, -21, -19, -17, -16, -14, -12, -10, -8, -5, -2, 1, 4, 8, 11, 14, 15, 17, 18, 20, 22, 23, 24, 26, 27, 27, 26, 26, 26, 29, 33, 34, 35, 32, 31, 31, 30, 28, 28, 27, 26, 26, 26, 27, 28, 30, 31, 30, 30, 28, 26, 25, 24, 23, 25, 28, 26, 25, 23, 21, 19, 18, 18, 18, 17, 16, 13, 11, 11, 12, 13, 12, 12, 13, 11, 9, 8, 8, 7, 6, 5, 5, 5, 5, 2, 1, -0, -1, 1, -0, -5, -10, -15, -19, -23, -27, -29, -31, -32, -34, -36, -37, -36, -35, -37, -42, -43, -50, -50, -52, -54, -56, -58, -60, -63, -67, -65, -67, -69, -69, -70, -70, -71, -72, -71, -72, -72, -70, -68, -65, -67, -67, -70, -68, -67, -65, -63, -60, -60, -57, -51, -49, -48, -44, -41, -39, -38, -35, -33, -31, -29, -27, -24, -21, -18, -14, -10, -7, -4, 0, 4, 7, 10, 15, 19, 22, 24, 30, 33, 30, 33, 35, 37, 38, 39, 39, 40, 40, 40, 41, 42, 43, 45, 46, 47, 49, 49, 49, 49, 51, 50, 48, 42, 35, 33, 38, 38, 38, 37, 35, 33, 31, 29, 26, 25, 23, 22, 21, 20, 19, 17, 19, 15, 17, 14, 12, 11, 10, 9, 9, 7, 7, 7, 6, 6, 6, 5, + /* 20.0 */ 4, 5, 4, 4, 4, 5, 6, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 7, 5, 6, 18, 12, -2, -3, -4, -5, -7, -8, -10, -11, -13, -15, -17, -18, -20, -22, -23, -24, -26, -28, -29, -31, -33, -35, -36, -38, -39, -41, -42, -43, -44, -45, -46, -47, -47, -48, -48, -47, -46, -46, -44, -43, -41, -40, -38, -36, -34, -32, -30, -29, -29, -21, -16, -14, -12, -10, -7, -6, -6, -10, -15, -19, -17, -16, -13, -12, -11, -10, -9, -13, -16, -15, -17, -17, -18, -19, -19, -21, -23, -25, -26, -27, -36, -37, -41, -45, -47, -51, -59, -62, -65, -63, -59, -57, -53, -50, -47, -46, -45, -46, -45, -43, -41, -40, -38, -36, -33, -30, -27, -24, -21, -18, -17, -15, -14, -12, -10, -8, -6, -4, -1, 2, 6, 9, 13, 15, 17, 18, 19, 20, 21, 23, 23, 25, 26, 25, 25, 26, 28, 31, 33, 34, 34, 34, 33, 32, 30, 29, 27, 27, 27, 27, 27, 27, 29, 30, 31, 31, 32, 30, 28, 27, 25, 24, 25, 27, 27, 25, 23, 21, 20, 20, 22, 23, 24, 20, 14, 12, 12, 12, 13, 14, 14, 14, 12, 11, 10, 9, 9, 8, 7, 6, 7, 6, 3, 2, 2, 2, 3, -1, -5, -10, -15, -20, -24, -28, -31, -33, -34, -35, -36, -37, -35, -33, -35, -39, -43, -48, -49, -50, -52, -55, -56, -57, -61, -63, -61, -64, -65, -66, -66, -67, -67, -67, -68, -68, -68, -67, -65, -65, -63, -63, -64, -64, -62, -61, -60, -57, -55, -53, -50, -51, -48, -44, -42, -39, -37, -35, -34, -31, -30, -28, -25, -23, -21, -17, -13, -9, -6, -2, 2, 5, 9, 13, 17, 20, 21, 22, 31, 28, 31, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 44, 45, 47, 48, 49, 49, 49, 50, 49, 47, 41, 31, 36, 41, 41, 37, 36, 33, 31, 28, 28, 27, 24, 21, 22, 21, 19, 18, 15, 14, 13, 13, 11, 10, 9, 7, 8, 6, 6, 5, 7, 5, 5, 4, 4, + /* 21.0 */ 3, 2, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 9, 9, 9, 9, 8, 7, 6, 6, 12, 15, 10, -0, -2, -3, -4, -6, -8, -9, -11, -12, -14, -16, -17, -19, -20, -22, -23, -25, -27, -28, -30, -32, -34, -35, -36, -38, -40, -41, -42, -43, -45, -46, -46, -47, -48, -48, -47, -47, -47, -46, -45, -43, -42, -40, -38, -36, -34, -32, -31, -30, -28, -22, -18, -15, -13, -11, -10, -10, -13, -15, -19, -22, -21, -21, -14, -13, -14, -12, -12, -11, -18, -19, -20, -20, -22, -23, -24, -21, -23, -25, -29, -34, -42, -44, -46, -44, -48, -51, -51, -51, -52, -52, -51, -51, -51, -50, -49, -47, -45, -44, -44, -42, -41, -39, -36, -34, -31, -29, -26, -22, -19, -16, -15, -13, -12, -10, -8, -6, -4, -2, 1, 4, 7, 11, 14, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 24, 24, 25, 28, 32, 35, 36, 35, 35, 35, 33, 32, 30, 29, 28, 27, 27, 27, 27, 29, 29, 30, 31, 32, 32, 30, 29, 28, 26, 26, 28, 27, 25, 24, 22, 21, 22, 25, 29, 30, 24, 17, 14, 13, 13, 13, 15, 15, 14, 13, 11, 10, 9, 10, 9, 9, 9, 8, 6, 4, 3, 4, 6, 4, -0, -4, -8, -13, -19, -24, -28, -31, -33, -35, -35, -36, -36, -35, -34, -33, -35, -40, -43, -46, -48, -50, -55, -55, -57, -58, -57, -57, -59, -61, -62, -63, -63, -63, -63, -64, -64, -65, -65, -64, -64, -62, -60, -60, -62, -59, -58, -57, -56, -54, -52, -51, -52, -48, -43, -42, -39, -37, -36, -34, -32, -31, -29, -27, -24, -22, -19, -15, -11, -8, -4, -1, 3, 8, 12, 15, 18, 19, 21, 28, 26, 29, 31, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 42, 45, 46, 47, 48, 48, 48, 49, 48, 44, 35, 29, 38, 37, 36, 34, 33, 33, 29, 30, 26, 25, 23, 19, 19, 18, 16, 16, 14, 12, 12, 10, 9, 8, 7, 6, 5, 4, 5, 4, 5, 6, 4, 4, 3, + /* 22.0 */ 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 9, 9, 8, 8, 7, 8, 14, 11, 7, 2, -1, -0, -1, -3, -5, -7, -9, -10, -11, -13, -15, -16, -18, -20, -21, -23, -24, -25, -27, -29, -31, -32, -34, -35, -36, -38, -39, -41, -42, -43, -45, -45, -46, -47, -47, -48, -47, -47, -47, -46, -45, -43, -42, -40, -38, -37, -35, -33, -31, -29, -25, -22, -18, -15, -13, -12, -12, -14, -16, -19, -24, -26, -24, -24, -18, -16, -15, -15, -14, -13, -18, -20, -19, -17, -18, -20, -21, -23, -24, -29, -32, -37, -38, -42, -43, -49, -51, -51, -51, -51, -52, -52, -52, -52, -51, -50, -50, -49, -47, -45, -44, -42, -40, -38, -36, -34, -31, -27, -24, -21, -17, -14, -13, -11, -10, -8, -6, -4, -2, 0, 3, 6, 9, 11, 14, 15, 17, 17, 17, 18, 19, 20, 22, 23, 24, 24, 24, 25, 27, 33, 36, 36, 36, 37, 37, 35, 33, 32, 30, 29, 27, 26, 25, 25, 27, 29, 30, 31, 32, 32, 31, 32, 31, 30, 30, 30, 27, 27, 25, 24, 23, 24, 26, 28, 28, 26, 20, 17, 15, 13, 13, 15, 15, 14, 13, 12, 11, 10, 9, 9, 10, 11, 8, 6, 5, 4, 6, 6, 4, 1, -2, -6, -10, -16, -23, -27, -31, -33, -34, -34, -34, -35, -35, -33, -32, -32, -36, -41, -42, -45, -44, -49, -52, -53, -54, -54, -54, -56, -58, -60, -60, -60, -61, -60, -59, -60, -60, -61, -62, -62, -60, -58, -58, -59, -58, -57, -57, -56, -54, -51, -51, -51, -48, -44, -42, -40, -38, -37, -34, -33, -30, -30, -29, -26, -23, -20, -17, -14, -10, -6, -2, 1, 5, 10, 14, 17, 19, 22, 23, 24, 27, 28, 30, 32, 34, 35, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 48, 47, 49, 47, 43, 33, 26, 32, 37, 37, 36, 34, 32, 30, 27, 26, 23, 22, 20, 19, 17, 16, 15, 13, 11, 10, 8, 7, 7, 6, 5, 4, 3, 3, 2, 4, 2, 2, 3, 2, 1, + /* 23.0 */ -1, -1, -0, 1, 1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 7, 8, 10, 11, 12, 7, 4, 4, 3, 3, 3, 2, -0, -3, -6, -8, -9, -11, -12, -14, -16, -17, -18, -20, -21, -22, -24, -26, -27, -29, -31, -33, -34, -35, -36, -38, -40, -41, -42, -43, -45, -46, -46, -47, -47, -48, -47, -47, -46, -46, -45, -43, -42, -40, -39, -37, -33, -33, -31, -28, -25, -21, -18, -16, -14, -13, -13, -16, -18, -22, -26, -29, -27, -26, -27, -25, -20, -16, -17, -18, -19, -23, -23, -22, -22, -23, -24, -25, -24, -27, -30, -36, -39, -44, -47, -49, -50, -51, -51, -52, -52, -52, -53, -53, -52, -51, -50, -49, -47, -46, -44, -42, -39, -37, -34, -31, -29, -26, -22, -19, -16, -12, -11, -9, -8, -6, -4, -2, -1, 2, 4, 7, 9, 11, 13, 15, 16, 17, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 29, 33, 36, 38, 37, 39, 38, 36, 35, 33, 31, 29, 28, 26, 25, 25, 27, 27, 30, 32, 32, 33, 33, 34, 36, 34, 33, 31, 29, 29, 27, 25, 25, 26, 27, 27, 27, 25, 22, 19, 16, 14, 14, 14, 15, 14, 13, 13, 11, 10, 10, 9, 11, 11, 8, 7, 6, 6, 7, 6, 5, 2, 0, -3, -8, -13, -20, -26, -30, -32, -33, -33, -33, -33, -33, -30, -28, -30, -38, -40, -43, -46, -45, -47, -47, -48, -50, -51, -52, -53, -55, -56, -57, -56, -57, -58, -59, -60, -58, -59, -60, -60, -57, -55, -56, -56, -57, -56, -56, -55, -54, -51, -51, -51, -48, -44, -43, -41, -39, -37, -35, -33, -31, -30, -29, -28, -26, -22, -19, -15, -12, -8, -4, -0, 4, 8, 13, 16, 19, 26, 20, 17, 19, 22, 26, 30, 32, 34, 35, 36, 37, 38, 39, 40, 39, 42, 44, 46, 47, 48, 47, 40, 33, 27, 31, 35, 36, 35, 34, 31, 29, 31, 25, 24, 23, 21, 19, 15, 14, 13, 12, 11, 9, 8, 7, 5, 4, 3, 2, 2, 1, 1, 1, -0, 1, 0, -0, -1, -1, + /* 24.0 */ -2, -2, -1, -0, 0, 2, 2, 3, 4, 4, 4, 6, 7, 12, 14, 10, 7, 5, 5, 4, 4, 4, 4, 3, 2, 1, -2, -5, -7, -9, -10, -11, -13, -14, -16, -17, -19, -20, -21, -22, -24, -26, -28, -29, -31, -33, -34, -36, -37, -39, -40, -41, -42, -43, -44, -45, -46, -47, -47, -47, -47, -47, -46, -45, -44, -43, -42, -41, -37, -35, -33, -33, -30, -27, -22, -19, -18, -17, -15, -14, -13, -18, -20, -23, -28, -31, -31, -28, -28, -29, -28, -24, -21, -23, -24, -26, -25, -25, -26, -26, -26, -27, -27, -32, -34, -39, -43, -45, -48, -50, -51, -52, -52, -52, -51, -52, -52, -53, -52, -51, -50, -49, -47, -46, -44, -41, -39, -36, -34, -31, -28, -25, -21, -17, -13, -11, -9, -7, -5, -3, -2, 0, 2, 3, 5, 7, 9, 11, 14, 16, 17, 18, 19, 20, 20, 22, 23, 24, 25, 27, 28, 30, 31, 33, 35, 37, 40, 39, 38, 38, 36, 34, 33, 31, 30, 29, 27, 26, 26, 28, 29, 31, 32, 33, 34, 36, 37, 37, 35, 34, 33, 30, 28, 26, 26, 26, 27, 27, 26, 25, 22, 20, 17, 15, 14, 15, 14, 14, 13, 13, 12, 12, 11, 10, 11, 11, 9, 8, 8, 8, 8, 8, 6, 4, 2, -2, -5, -11, -18, -24, -28, -31, -33, -33, -33, -33, -30, -27, -30, -36, -37, -39, -42, -45, -47, -48, -45, -46, -46, -48, -48, -49, -51, -52, -53, -54, -55, -55, -56, -58, -58, -59, -59, -59, -58, -57, -56, -55, -56, -56, -55, -55, -55, -52, -51, -51, -49, -46, -43, -41, -39, -37, -36, -33, -32, -32, -31, -29, -27, -24, -20, -17, -13, -10, -6, -2, 2, 6, 10, 14, 17, 24, 15, 18, 21, 23, 27, 25, 29, 32, 35, 36, 37, 37, 37, 38, 39, 42, 44, 45, 46, 48, 44, 35, 29, 36, 37, 35, 34, 32, 33, 30, 28, 25, 24, 21, 20, 19, 16, 16, 13, 12, 11, 9, 7, 5, 4, 3, 2, 1, 1, -0, -1, -1, -1, -1, -2, -2, -3, -2, -2, + /* 25.0 */ -3, -2, -1, -1, -1, -0, 1, 0, 5, 6, 7, 6, 14, 7, 3, 4, 4, 4, 4, 4, 3, 3, 2, 1, -0, -2, -4, -7, -8, -10, -11, -12, -14, -15, -16, -17, -19, -20, -21, -23, -25, -26, -28, -30, -31, -33, -34, -36, -38, -39, -41, -42, -43, -44, -45, -46, -46, -47, -47, -47, -47, -46, -45, -45, -43, -43, -41, -39, -37, -34, -35, -33, -30, -26, -22, -21, -20, -19, -16, -15, -16, -19, -23, -22, -27, -32, -32, -30, -28, -27, -27, -28, -28, -26, -24, -27, -23, -23, -24, -24, -28, -28, -32, -33, -39, -43, -44, -47, -49, -51, -52, -52, -52, -51, -51, -51, -51, -52, -52, -51, -49, -48, -47, -45, -43, -41, -38, -35, -33, -29, -26, -22, -19, -15, -11, -8, -7, -4, -2, -0, 1, 3, 5, 6, 8, 9, 11, 13, 15, 17, 18, 19, 21, 21, 21, 22, 23, 25, 26, 28, 31, 33, 33, 31, 34, 34, 37, 39, 40, 39, 38, 36, 34, 32, 31, 30, 29, 28, 27, 27, 27, 28, 28, 30, 33, 35, 36, 36, 36, 35, 33, 30, 29, 27, 26, 25, 27, 28, 26, 25, 22, 20, 19, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 12, 13, 12, 10, 9, 10, 10, 10, 9, 8, 5, 2, -2, -5, -10, -16, -22, -27, -30, -31, -32, -33, -33, -28, -27, -29, -30, -32, -32, -34, -36, -38, -42, -43, -43, -45, -46, -46, -46, -48, -49, -48, -52, -54, -54, -56, -59, -60, -60, -60, -62, -62, -62, -61, -59, -56, -55, -54, -53, -52, -51, -50, -51, -49, -45, -41, -40, -39, -37, -35, -33, -31, -32, -32, -30, -27, -25, -21, -17, -14, -11, -7, -4, 1, 5, 9, 12, 15, 18, 20, 22, 25, 28, 26, 25, 24, 29, 33, 36, 34, 36, 37, 37, 39, 41, 43, 44, 46, 47, 42, 33, 38, 38, 35, 34, 32, 31, 28, 27, 26, 24, 21, 19, 17, 15, 14, 13, 10, 9, 9, 7, 5, 3, 2, 1, 0, -1, -1, -2, -3, -3, -3, -4, -4, -4, -4, -3, -3, + /* 26.0 */ -4, -3, -3, -2, -2, -1, 6, 2, 5, 6, 3, 5, 5, 3, 4, 4, 4, 3, 3, 2, 2, 1, -0, -2, -3, -5, -7, -8, -9, -11, -12, -13, -14, -15, -17, -18, -19, -20, -22, -23, -25, -27, -28, -30, -32, -33, -35, -36, -38, -39, -41, -42, -43, -44, -45, -46, -46, -46, -46, -46, -46, -46, -45, -44, -43, -42, -41, -37, -36, -35, -35, -31, -29, -24, -21, -21, -21, -20, -18, -19, -20, -23, -25, -23, -27, -33, -31, -29, -29, -29, -27, -26, -26, -25, -26, -28, -25, -25, -24, -26, -28, -30, -33, -39, -44, -43, -45, -48, -50, -51, -53, -52, -51, -50, -50, -50, -50, -51, -51, -50, -49, -47, -46, -44, -42, -39, -37, -34, -31, -28, -24, -21, -17, -13, -10, -6, -4, -2, 1, 2, 4, 6, 7, 9, 11, 12, 13, 15, 17, 19, 20, 22, 23, 24, 24, 24, 25, 26, 27, 29, 32, 34, 34, 31, 31, 34, 36, 39, 39, 40, 40, 37, 35, 33, 32, 32, 31, 30, 28, 27, 26, 26, 26, 28, 30, 32, 34, 33, 33, 32, 31, 29, 28, 27, 26, 26, 28, 30, 28, 26, 24, 22, 21, 19, 17, 15, 14, 13, 13, 12, 13, 13, 13, 13, 14, 12, 11, 13, 12, 12, 11, 10, 8, 5, 2, -1, -5, -10, -15, -21, -26, -28, -30, -31, -32, -33, -31, -26, -22, -24, -26, -28, -30, -31, -31, -35, -40, -42, -44, -45, -45, -45, -46, -48, -48, -49, -53, -55, -57, -59, -61, -62, -64, -66, -66, -65, -64, -62, -58, -53, -50, -49, -48, -53, -55, -52, -49, -46, -42, -39, -38, -37, -36, -33, -31, -31, -30, -28, -26, -24, -21, -19, -16, -13, -9, -6, -1, 3, 7, 10, 13, 16, 19, 22, 26, 28, 29, 29, 28, 25, 28, 33, 36, 36, 36, 37, 39, 40, 42, 43, 44, 43, 39, 35, 39, 38, 36, 34, 32, 28, 27, 26, 24, 22, 19, 17, 14, 13, 11, 10, 8, 7, 6, 5, 3, 2, 1, -0, -2, -3, -3, -4, -5, -5, -5, -5, -5, -5, -4, -4, -4, + /* 27.0 */ -4, -5, -4, -1, -1, -3, -3, -3, -1, -1, 1, 2, 2, 3, 3, 3, 2, 1, 0, 0, -1, -2, -3, -5, -6, -7, -8, -10, -11, -12, -13, -14, -15, -16, -17, -18, -20, -21, -23, -24, -26, -28, -29, -31, -32, -33, -35, -36, -38, -39, -41, -42, -43, -44, -45, -45, -45, -46, -46, -46, -45, -45, -44, -43, -43, -43, -38, -37, -36, -36, -33, -31, -27, -24, -23, -22, -21, -20, -20, -21, -22, -25, -26, -25, -28, -31, -30, -29, -29, -29, -27, -26, -26, -27, -29, -27, -25, -26, -26, -27, -30, -30, -33, -38, -44, -44, -45, -48, -50, -52, -52, -52, -51, -49, -49, -49, -49, -49, -49, -49, -48, -46, -45, -43, -41, -38, -35, -33, -30, -26, -23, -19, -15, -12, -8, -4, -1, 1, 3, 5, 7, 8, 10, 12, 14, 15, 17, 18, 20, 21, 23, 23, 25, 26, 26, 26, 25, 26, 28, 30, 31, 34, 34, 33, 32, 32, 36, 38, 39, 39, 40, 38, 38, 35, 33, 33, 33, 32, 30, 27, 26, 26, 25, 26, 27, 29, 30, 30, 30, 30, 29, 29, 28, 27, 27, 28, 30, 31, 30, 27, 25, 23, 22, 20, 18, 16, 15, 14, 14, 14, 13, 13, 13, 14, 13, 12, 14, 15, 14, 12, 11, 10, 7, 4, 1, -2, -6, -10, -15, -20, -25, -27, -29, -28, -26, -26, -30, -28, -20, -22, -24, -25, -27, -29, -31, -31, -35, -40, -45, -43, -45, -45, -44, -46, -48, -47, -50, -54, -57, -60, -63, -66, -67, -67, -67, -65, -59, -51, -47, -41, -41, -42, -42, -47, -56, -56, -51, -46, -44, -40, -36, -35, -35, -34, -32, -31, -31, -29, -27, -24, -22, -19, -18, -15, -11, -7, -4, 1, 5, 9, 12, 15, 17, 21, 24, 27, 30, 31, 32, 26, 24, 29, 33, 35, 35, 37, 39, 40, 42, 43, 44, 42, 46, 33, 33, 35, 34, 32, 29, 28, 25, 23, 22, 18, 16, 15, 13, 11, 10, 8, 7, 5, 4, 3, 1, 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -6, -5, -5, -4, -4, -4, + /* 28.0 */ -5, -4, -0, -2, 1, -4, -5, -3, -2, -1, -0, 0, 1, 1, 0, -0, -1, -2, -2, -3, -3, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -14, -15, -16, -18, -19, -21, -22, -24, -25, -27, -28, -30, -31, -32, -34, -35, -36, -38, -39, -40, -42, -43, -44, -44, -44, -45, -45, -45, -45, -44, -44, -43, -43, -43, -37, -37, -35, -36, -34, -32, -29, -25, -24, -24, -23, -22, -21, -21, -23, -24, -26, -28, -28, -27, -28, -27, -26, -26, -25, -26, -27, -30, -31, -30, -26, -25, -26, -28, -30, -31, -34, -36, -38, -45, -45, -46, -48, -50, -52, -52, -51, -50, -48, -48, -47, -47, -47, -47, -46, -46, -44, -43, -41, -39, -36, -34, -31, -28, -25, -21, -18, -14, -10, -6, -2, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 20, 21, 23, 25, 26, 26, 26, 27, 27, 27, 27, 27, 28, 30, 31, 34, 38, 45, 44, 41, 41, 39, 39, 39, 39, 39, 38, 36, 36, 36, 36, 34, 31, 30, 28, 28, 27, 27, 28, 28, 28, 28, 29, 29, 28, 28, 29, 29, 29, 30, 30, 30, 29, 26, 25, 23, 22, 21, 20, 17, 15, 15, 15, 15, 15, 14, 14, 13, 11, 13, 18, 17, 14, 12, 10, 8, 6, 3, -0, -3, -7, -11, -15, -19, -23, -26, -24, -21, -19, -19, -21, -19, -18, -20, -20, -21, -25, -30, -32, -32, -32, -38, -44, -42, -45, -48, -47, -47, -46, -47, -48, -53, -56, -60, -63, -63, -58, -55, -53, -45, -33, -29, -29, -29, -30, -31, -30, -34, -41, -48, -49, -42, -40, -37, -34, -32, -33, -35, -37, -37, -35, -31, -28, -25, -23, -20, -19, -16, -12, -9, -5, -1, 3, 7, 10, 13, 16, 20, 23, 26, 29, 31, 31, 29, 25, 26, 33, 35, 35, 37, 38, 40, 41, 42, 43, 40, 48, 32, 30, 32, 33, 30, 28, 24, 22, 21, 18, 17, 15, 13, 11, 9, 8, 6, 5, 4, 3, 1, 0, -1, -2, -3, -4, -5, -6, -7, -7, -7, -7, -6, -6, -5, -5, -5, -5, + /* 29.0 */ -5, -3, -5, -6, -5, -6, -4, -4, -3, -3, -3, -2, -2, -3, -3, -3, -4, -4, -4, -6, -7, -8, -9, -10, -10, -11, -12, -12, -13, -13, -15, -16, -17, -17, -19, -20, -22, -23, -25, -26, -27, -29, -30, -31, -33, -34, -35, -36, -38, -39, -41, -42, -43, -43, -44, -44, -44, -44, -44, -44, -43, -43, -42, -42, -41, -38, -35, -37, -35, -33, -31, -29, -25, -24, -25, -24, -23, -22, -22, -24, -24, -25, -27, -29, -28, -27, -27, -26, -25, -25, -25, -25, -29, -29, -27, -28, -28, -29, -29, -30, -32, -35, -37, -41, -46, -46, -47, -48, -51, -52, -52, -51, -49, -48, -47, -46, -45, -45, -44, -44, -43, -42, -40, -38, -37, -34, -32, -29, -26, -23, -19, -16, -12, -8, -4, -0, 4, 7, 9, 11, 13, 15, 16, 18, 20, 22, 23, 25, 26, 27, 28, 28, 27, 28, 29, 29, 29, 29, 30, 32, 32, 34, 39, 37, 37, 36, 42, 42, 41, 41, 42, 42, 40, 40, 40, 40, 40, 38, 36, 34, 31, 29, 28, 28, 28, 27, 27, 27, 27, 28, 29, 28, 29, 30, 31, 31, 30, 29, 29, 26, 25, 23, 22, 23, 21, 20, 18, 16, 15, 16, 16, 15, 16, 14, 13, 15, 20, 17, 14, 12, 10, 8, 5, 2, -0, -3, -7, -11, -15, -18, -21, -21, -15, -12, -13, -11, -8, -7, -11, -17, -17, -17, -22, -25, -27, -30, -30, -34, -42, -39, -45, -50, -49, -48, -47, -47, -49, -51, -55, -57, -55, -48, -40, -34, -31, -29, -30, -30, -31, -33, -34, -33, -32, -31, -30, -40, -44, -40, -37, -34, -32, -31, -32, -38, -43, -42, -39, -34, -30, -27, -24, -21, -20, -18, -13, -9, -6, -2, 2, 6, 8, 12, 15, 19, 22, 24, 27, 29, 30, 30, 26, 24, 29, 33, 36, 36, 38, 39, 40, 42, 43, 36, 37, 23, 30, 32, 30, 28, 25, 23, 21, 20, 17, 16, 13, 11, 10, 9, 7, 5, 4, 3, 2, 1, -1, -3, -3, -5, -5, -6, -6, -7, -7, -7, -7, -6, -6, -6, -6, -6, -5, + /* 30.0 */ -8, -8, -8, -8, -7, -8, -6, -6, -6, -5, -5, -6, -6, -6, -6, -6, -6, -7, -7, -8, -9, -10, -11, -11, -12, -12, -13, -13, -14, -15, -16, -17, -17, -18, -20, -21, -23, -24, -25, -27, -28, -29, -31, -32, -33, -34, -36, -37, -38, -39, -40, -41, -42, -42, -43, -43, -43, -43, -43, -43, -42, -42, -41, -40, -38, -35, -37, -35, -33, -31, -30, -28, -25, -25, -25, -24, -22, -23, -24, -24, -23, -24, -27, -28, -29, -29, -28, -28, -28, -28, -27, -28, -28, -28, -28, -29, -29, -29, -29, -30, -32, -36, -39, -41, -46, -46, -47, -49, -51, -52, -52, -51, -49, -47, -46, -45, -43, -42, -42, -41, -41, -40, -38, -36, -35, -33, -30, -28, -25, -21, -18, -14, -10, -6, -3, 1, 5, 9, 12, 14, 16, 18, 20, 22, 23, 25, 26, 28, 29, 30, 30, 33, 33, 30, 31, 30, 30, 31, 32, 33, 34, 35, 35, 37, 39, 40, 41, 44, 42, 40, 43, 47, 49, 48, 47, 46, 44, 41, 39, 38, 35, 33, 30, 29, 27, 26, 26, 26, 27, 27, 28, 29, 30, 31, 31, 30, 30, 29, 28, 27, 26, 24, 23, 22, 22, 21, 21, 18, 17, 17, 16, 16, 16, 17, 17, 17, 19, 17, 14, 12, 10, 7, 5, 2, -0, -4, -8, -13, -15, -17, -18, -13, -7, -8, -8, -6, -6, -7, -13, -16, -15, -19, -22, -23, -24, -27, -28, -28, -34, -33, -39, -49, -49, -47, -46, -46, -48, -50, -48, -39, -35, -29, -25, -26, -27, -28, -30, -30, -31, -33, -34, -35, -35, -34, -35, -38, -38, -36, -35, -34, -32, -31, -32, -41, -44, -42, -41, -38, -32, -27, -24, -22, -22, -19, -15, -11, -7, -3, 1, 4, 7, 10, 14, 17, 21, 23, 25, 28, 30, 31, 30, 26, 27, 32, 34, 36, 37, 39, 39, 42, 42, 35, 25, 23, 30, 30, 28, 26, 23, 21, 19, 17, 16, 14, 12, 11, 9, 8, 6, 4, 3, 2, -0, -1, -3, -4, -5, -6, -6, -7, -7, -7, -7, -7, -6, -7, -7, -7, -7, -5, -8, + /* 31.0 */ -8, -9, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -9, -9, -10, -11, -12, -13, -13, -13, -13, -14, -15, -15, -16, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -33, -35, -36, -37, -38, -39, -40, -41, -41, -42, -42, -42, -42, -42, -42, -42, -41, -41, -40, -38, -34, -35, -36, -34, -32, -30, -28, -27, -26, -26, -24, -24, -23, -24, -25, -24, -24, -25, -27, -27, -28, -28, -29, -28, -28, -28, -28, -29, -29, -29, -28, -29, -29, -29, -30, -31, -34, -36, -40, -43, -44, -44, -48, -51, -52, -52, -51, -50, -48, -46, -45, -43, -42, -40, -40, -39, -39, -38, -36, -35, -33, -31, -28, -26, -23, -19, -16, -12, -8, -5, -1, 3, 7, 11, 14, 18, 20, 22, 24, 25, 27, 28, 29, 30, 32, 32, 32, 34, 32, 32, 32, 31, 30, 32, 33, 35, 36, 37, 37, 38, 39, 41, 44, 44, 44, 43, 46, 51, 53, 54, 52, 50, 48, 46, 43, 42, 39, 37, 34, 32, 29, 27, 27, 27, 27, 28, 29, 31, 32, 31, 31, 30, 29, 28, 28, 27, 27, 26, 24, 23, 22, 21, 21, 19, 17, 15, 15, 16, 16, 17, 17, 18, 20, 18, 16, 14, 12, 9, 5, 2, -1, -6, -10, -14, -16, -16, -11, -5, -3, -4, -5, -5, -7, -9, -14, -14, -15, -19, -21, -22, -23, -25, -26, -25, -26, -31, -37, -48, -47, -45, -44, -46, -48, -44, -36, -24, -22, -24, -26, -28, -29, -30, -31, -31, -33, -34, -35, -36, -36, -37, -36, -37, -38, -37, -36, -34, -32, -31, -31, -33, -41, -43, -42, -39, -35, -29, -24, -23, -22, -20, -16, -12, -8, -4, -1, 3, 6, 9, 13, 16, 19, 22, 24, 27, 29, 30, 31, 29, 27, 30, 33, 36, 37, 38, 39, 42, 42, 35, 20, 24, 29, 28, 26, 24, 22, 20, 18, 16, 14, 13, 11, 10, 9, 7, 6, 4, 3, 1, -1, -3, -4, -5, -7, -7, -8, -8, -8, -8, -9, -8, -8, -8, -6, -8, -8, -9, -8, + /* 32.0 */ -9, -10, -9, -9, -10, -10, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -10, -11, -11, -12, -13, -14, -14, -14, -14, -15, -16, -17, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -33, -34, -36, -37, -38, -39, -40, -40, -40, -41, -41, -42, -42, -42, -42, -42, -41, -41, -39, -38, -37, -33, -35, -34, -33, -31, -30, -28, -27, -26, -25, -24, -23, -26, -24, -26, -26, -27, -28, -28, -28, -27, -28, -27, -27, -27, -27, -27, -28, -29, -29, -28, -27, -28, -29, -31, -33, -34, -37, -39, -41, -43, -46, -50, -51, -51, -51, -50, -48, -47, -45, -43, -37, -40, -39, -37, -37, -37, -36, -35, -34, -31, -29, -26, -24, -21, -18, -14, -10, -7, -3, 1, 4, 8, 12, 16, 20, 23, 25, 27, 28, 30, 31, 33, 34, 35, 36, 36, 36, 38, 34, 34, 33, 33, 33, 34, 36, 38, 39, 40, 41, 40, 40, 42, 43, 43, 44, 46, 48, 49, 50, 55, 54, 51, 48, 47, 44, 41, 39, 38, 36, 32, 30, 28, 28, 29, 30, 32, 33, 32, 33, 32, 30, 29, 27, 27, 27, 29, 30, 27, 25, 22, 18, 14, 11, 11, 12, 16, 19, 17, 17, 16, 20, 21, 20, 19, 18, 15, 11, 7, 2, -2, -7, -10, -12, -14, -12, -4, -1, -1, -2, -3, -5, -6, -10, -12, -12, -14, -18, -21, -22, -24, -24, -25, -25, -26, -31, -40, -45, -43, -43, -44, -46, -46, -35, -28, -25, -24, -26, -28, -29, -30, -31, -32, -33, -35, -37, -37, -37, -37, -38, -38, -39, -39, -39, -37, -34, -34, -32, -32, -31, -35, -41, -41, -38, -34, -29, -26, -24, -24, -21, -17, -13, -9, -6, -2, 2, 5, 9, 12, 15, 18, 21, 24, 26, 29, 30, 32, 31, 26, 31, 33, 33, 36, 37, 39, 42, 42, 33, 16, 25, 29, 28, 26, 24, 22, 20, 17, 16, 13, 12, 11, 9, 8, 7, 6, 4, 1, -1, -3, -4, -6, -7, -8, -8, -9, -8, -8, -9, -8, -5, -9, -9, -9, -9, -9, -9, -9, + /* 33.0 */ -9, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -12, -13, -13, -14, -14, -15, -15, -15, -15, -16, -17, -18, -20, -21, -23, -24, -25, -26, -27, -28, -29, -29, -30, -32, -33, -34, -35, -36, -37, -38, -39, -39, -40, -41, -41, -41, -41, -42, -41, -41, -41, -40, -38, -38, -37, -33, -34, -34, -33, -32, -31, -29, -28, -26, -24, -24, -22, -22, -24, -22, -25, -27, -30, -30, -30, -28, -27, -28, -28, -27, -27, -27, -28, -29, -30, -30, -30, -30, -29, -29, -31, -33, -34, -36, -39, -40, -44, -48, -50, -51, -51, -50, -49, -47, -46, -44, -42, -40, -38, -38, -36, -35, -35, -34, -32, -31, -29, -27, -25, -22, -18, -16, -12, -9, -5, -1, 3, 6, 10, 14, 17, 21, 25, 28, 30, 32, 33, 34, 36, 37, 38, 39, 39, 40, 38, 38, 38, 37, 35, 35, 35, 36, 40, 43, 45, 48, 45, 43, 41, 42, 42, 41, 39, 46, 48, 51, 52, 55, 52, 52, 50, 48, 45, 42, 40, 39, 36, 32, 30, 29, 29, 31, 33, 33, 33, 32, 31, 30, 29, 28, 27, 27, 28, 28, 29, 23, 14, 10, 7, 7, 7, 9, 12, 14, 15, 16, 16, 20, 24, 24, 21, 19, 17, 13, 8, 3, -1, -4, -5, -3, -3, -0, 4, 3, 1, -1, -4, -5, -8, -10, -12, -12, -14, -19, -21, -21, -21, -23, -24, -23, -26, -29, -37, -45, -47, -47, -45, -40, -34, -27, -23, -24, -25, -27, -29, -30, -31, -32, -33, -34, -36, -37, -38, -38, -38, -39, -39, -40, -40, -40, -37, -36, -35, -34, -34, -33, -34, -38, -39, -36, -34, -31, -28, -26, -23, -21, -18, -15, -11, -6, -2, 1, 5, 8, 11, 15, 18, 21, 24, 26, 28, 31, 32, 33, 31, 34, 35, 34, 34, 36, 37, 41, 43, 34, 15, 24, 28, 27, 25, 23, 21, 18, 16, 14, 13, 10, 9, 7, 6, 5, 5, 3, 0, -2, -4, -6, -7, -8, -9, -9, -9, -9, -10, -10, -7, -9, -9, -9, -9, -9, -9, -9, -9, + /* 34.0 */ -10, -10, -9, -10, -10, -11, -12, -12, -12, -12, -13, -13, -12, -12, -12, -12, -12, -13, -13, -14, -14, -15, -15, -16, -16, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -29, -29, -31, -32, -32, -34, -35, -36, -37, -38, -39, -40, -40, -41, -41, -41, -41, -41, -41, -41, -41, -40, -39, -37, -37, -34, -32, -32, -33, -31, -30, -29, -26, -24, -23, -22, -23, -21, -23, -24, -24, -26, -28, -29, -30, -27, -27, -29, -30, -29, -28, -27, -28, -27, -28, -28, -29, -30, -30, -31, -31, -31, -32, -34, -36, -39, -40, -41, -47, -48, -48, -49, -48, -47, -46, -45, -43, -42, -40, -38, -37, -35, -34, -33, -32, -30, -29, -28, -25, -22, -20, -16, -13, -10, -6, -3, 1, 4, 8, 11, 15, 18, 22, 26, 29, 32, 35, 36, 38, 39, 40, 41, 41, 42, 42, 42, 42, 40, 38, 38, 38, 38, 38, 40, 42, 43, 44, 46, 45, 43, 42, 41, 40, 37, 38, 43, 45, 46, 48, 52, 51, 51, 50, 48, 46, 45, 42, 39, 34, 31, 29, 30, 32, 33, 34, 33, 33, 32, 32, 31, 29, 28, 26, 25, 23, 19, 13, 9, 9, 6, 1, 1, 5, 8, 10, 13, 14, 15, 18, 28, 26, 22, 20, 18, 14, 10, 6, 1, 0, 4, 5, 5, 6, 6, 4, -1, -3, -5, -7, -10, -11, -12, -14, -17, -20, -21, -20, -20, -21, -22, -22, -23, -28, -35, -42, -48, -44, -38, -32, -25, -25, -23, -24, -25, -26, -28, -30, -32, -34, -34, -36, -37, -38, -39, -39, -40, -41, -41, -41, -41, -40, -39, -38, -36, -36, -36, -36, -36, -38, -38, -36, -35, -33, -28, -25, -23, -21, -19, -15, -11, -7, -3, 1, 5, 8, 11, 14, 18, 21, 24, 26, 28, 30, 31, 32, 32, 34, 37, 37, 40, 36, 37, 40, 39, 25, 11, 23, 27, 25, 24, 21, 19, 17, 16, 14, 11, 9, 7, 5, 4, 4, 3, 2, -0, -2, -4, -6, -8, -8, -9, -10, -9, -10, -12, -12, -9, -11, -9, -8, -9, -9, -9, -8, -10, + /* 35.0 */ -10, -10, -10, -10, -10, -12, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -14, -14, -14, -15, -15, -16, -16, -16, -17, -18, -19, -20, -21, -22, -23, -23, -24, -26, -27, -28, -29, -30, -32, -33, -33, -34, -35, -36, -38, -39, -39, -40, -40, -40, -41, -41, -41, -41, -41, -40, -39, -39, -36, -34, -33, -32, -32, -31, -30, -29, -27, -25, -24, -24, -23, -21, -22, -20, -22, -24, -25, -27, -28, -28, -27, -28, -27, -30, -32, -32, -30, -28, -28, -28, -29, -28, -29, -30, -31, -30, -31, -33, -32, -32, -35, -37, -39, -40, -43, -45, -47, -46, -46, -45, -45, -44, -42, -40, -39, -37, -36, -34, -33, -31, -30, -29, -27, -26, -23, -20, -18, -15, -11, -8, -4, -1, 2, 6, 9, 13, 16, 20, 23, 27, 30, 34, 37, 39, 41, 42, 43, 44, 45, 44, 45, 46, 44, 43, 43, 42, 41, 41, 40, 41, 42, 44, 47, 48, 46, 46, 48, 47, 44, 43, 41, 41, 40, 40, 44, 48, 50, 50, 50, 50, 49, 47, 44, 42, 37, 36, 37, 38, 37, 37, 36, 36, 36, 34, 34, 33, 29, 28, 26, 23, 17, 12, 9, 17, 20, 17, 10, 6, 6, 7, 7, 17, 28, 24, 19, 24, 26, 25, 22, 20, 17, 13, 10, 6, 6, 9, 11, 11, 9, 6, 1, -2, -5, -7, -9, -11, -12, -14, -16, -17, -21, -22, -23, -22, -22, -22, -23, -25, -29, -32, -35, -37, -35, -32, -28, -27, -23, -22, -22, -25, -26, -29, -32, -33, -35, -36, -37, -38, -39, -40, -41, -42, -43, -43, -42, -42, -42, -41, -40, -40, -39, -38, -38, -39, -39, -38, -36, -35, -34, -32, -27, -22, -21, -19, -16, -11, -7, -2, 2, 4, 7, 11, 14, 17, 20, 22, 25, 28, 29, 30, 31, 33, 35, 36, 36, 37, 37, 41, 39, 34, 23, 13, 20, 24, 23, 22, 21, 19, 17, 15, 12, 10, 8, 6, 5, 4, 3, 1, -1, -2, -3, -5, -6, -8, -9, -10, -10, -10, -10, -12, -9, -4, -13, -10, -10, -10, -10, -9, -10, -10, + /* 36.0 */ -11, -11, -11, -12, -12, -12, -13, -13, -13, -14, -14, -14, -14, -14, -13, -13, -13, -14, -14, -15, -15, -15, -16, -16, -17, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -29, -30, -31, -32, -33, -34, -35, -36, -37, -37, -39, -39, -39, -40, -40, -40, -40, -40, -40, -40, -39, -38, -36, -33, -34, -32, -29, -30, -29, -29, -27, -25, -23, -23, -21, -20, -21, -20, -19, -19, -21, -24, -27, -28, -29, -29, -28, -29, -30, -30, -29, -29, -29, -29, -29, -29, -29, -30, -30, -30, -32, -32, -32, -34, -33, -32, -36, -37, -40, -40, -43, -44, -44, -44, -43, -43, -42, -41, -39, -38, -37, -35, -33, -31, -30, -29, -27, -26, -23, -21, -18, -16, -11, -9, -5, -3, 0, 4, 7, 11, 14, 18, 22, 25, 28, 31, 34, 38, 41, 43, 46, 47, 47, 48, 48, 48, 49, 48, 48, 48, 47, 45, 44, 43, 41, 42, 43, 45, 47, 49, 46, 46, 47, 44, 43, 45, 45, 42, 42, 42, 46, 48, 48, 47, 47, 48, 48, 46, 44, 43, 43, 43, 43, 42, 40, 39, 39, 38, 37, 38, 31, 29, 29, 27, 21, 14, 11, 19, 28, 31, 29, 25, 16, 12, 15, 15, 21, 27, 25, 23, 25, 27, 26, 24, 22, 20, 16, 14, 13, 13, 15, 15, 12, 10, 5, 5, 1, -2, -4, -8, -10, -12, -13, -15, -18, -23, -27, -28, -29, -30, -30, -31, -32, -35, -29, -28, -30, -30, -31, -30, -26, -21, -24, -25, -30, -33, -33, -32, -34, -36, -37, -38, -39, -41, -42, -43, -44, -45, -46, -48, -47, -48, -47, -44, -46, -44, -43, -43, -42, -40, -37, -36, -34, -31, -29, -26, -22, -17, -17, -15, -12, -7, -2, 2, 4, 8, 10, 13, 16, 19, 22, 24, 27, 30, 28, 28, 30, 33, 33, 34, 36, 40, 42, 41, 38, 31, 19, 16, 22, 22, 22, 21, 19, 16, 14, 12, 10, 8, 6, 5, 3, 2, 2, 0, -2, -4, -5, -6, -7, -8, -9, -10, -10, -10, -12, -11, -11, -12, -11, -11, -11, -11, -10, -11, -11, + /* 37.0 */ -12, -12, -12, -13, -12, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -14, -14, -15, -15, -15, -16, -16, -17, -18, -18, -20, -20, -21, -22, -23, -24, -25, -26, -27, -29, -30, -31, -33, -34, -35, -36, -37, -37, -37, -38, -39, -39, -39, -40, -40, -40, -40, -39, -39, -38, -37, -33, -33, -32, -27, -27, -28, -27, -27, -26, -23, -23, -23, -22, -21, -21, -19, -17, -17, -20, -23, -26, -28, -28, -29, -29, -30, -30, -31, -30, -30, -30, -31, -30, -29, -30, -31, -32, -32, -31, -32, -32, -32, -33, -33, -34, -36, -39, -39, -42, -43, -43, -43, -42, -42, -42, -40, -39, -37, -35, -34, -32, -31, -28, -28, -25, -24, -22, -19, -16, -13, -10, -7, -4, -1, 2, 5, 9, 12, 16, 19, 23, 26, 29, 33, 36, 38, 42, 45, 47, 49, 51, 51, 51, 51, 52, 52, 52, 52, 49, 49, 49, 48, 47, 46, 46, 47, 47, 51, 52, 48, 46, 51, 49, 52, 52, 50, 47, 47, 48, 51, 50, 47, 46, 45, 44, 45, 45, 43, 43, 43, 43, 43, 42, 42, 42, 40, 38, 41, 31, 29, 28, 27, 23, 21, 25, 31, 36, 38, 37, 34, 30, 28, 29, 29, 33, 33, 32, 29, 30, 30, 27, 25, 23, 22, 19, 18, 19, 20, 17, 16, 12, 8, 5, -3, -7, -9, -10, -10, -10, -11, -14, -17, -23, -28, -31, -33, -35, -37, -38, -41, -44, -45, -39, -33, -30, -29, -29, -31, -28, -28, -34, -42, -48, -51, -51, -51, -46, -42, -39, -42, -42, -44, -46, -46, -50, -56, -58, -57, -55, -54, -50, -47, -46, -44, -43, -43, -44, -42, -40, -37, -34, -31, -30, -25, -21, -16, -16, -16, -12, -8, -3, 0, 4, 7, 10, 13, 16, 19, 21, 23, 26, 29, 27, 28, 29, 31, 32, 33, 35, 37, 40, 42, 43, 39, 28, 16, 18, 22, 22, 20, 18, 16, 14, 11, 10, 8, 6, 4, 2, 1, 1, -0, -2, -4, -5, -6, -7, -8, -9, -9, -10, -11, -13, -12, -13, -13, -12, -11, -11, -11, -11, -12, -12, + /* 38.0 */ -13, -12, -13, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -12, -12, -13, -13, -14, -14, -15, -15, -16, -17, -17, -18, -19, -20, -21, -22, -22, -24, -25, -26, -27, -29, -30, -31, -33, -33, -35, -35, -36, -36, -37, -37, -38, -38, -39, -39, -39, -39, -39, -38, -37, -37, -33, -32, -31, -26, -24, -25, -25, -25, -24, -23, -21, -19, -21, -20, -19, -17, -15, -16, -17, -21, -23, -25, -26, -27, -27, -29, -30, -32, -32, -33, -32, -32, -31, -30, -30, -31, -32, -34, -35, -34, -34, -33, -32, -32, -33, -34, -35, -37, -37, -39, -42, -42, -41, -41, -41, -41, -40, -38, -36, -34, -32, -30, -28, -28, -27, -24, -22, -20, -18, -15, -11, -8, -5, -2, 1, 4, 7, 9, 13, 16, 20, 23, 27, 31, 34, 37, 39, 42, 45, 48, 51, 53, 54, 55, 56, 55, 55, 55, 55, 53, 52, 51, 50, 49, 48, 49, 47, 48, 49, 50, 48, 45, 44, 49, 53, 55, 55, 55, 52, 51, 51, 52, 50, 49, 47, 46, 45, 44, 44, 43, 42, 42, 43, 44, 43, 43, 44, 42, 42, 38, 31, 29, 25, 23, 25, 29, 36, 39, 39, 39, 38, 36, 36, 37, 37, 37, 36, 35, 36, 35, 34, 31, 28, 26, 23, 23, 24, 24, 20, 18, 16, 13, 5, -8, -12, -12, -13, -16, -17, -16, -15, -19, -26, -29, -31, -33, -35, -36, -38, -38, -39, -43, -44, -41, -33, -30, -28, -28, -30, -33, -46, -52, -53, -54, -54, -55, -56, -56, -56, -55, -49, -45, -44, -48, -54, -59, -60, -58, -53, -48, -47, -47, -45, -44, -45, -46, -49, -47, -45, -42, -39, -36, -32, -30, -25, -20, -17, -16, -15, -13, -9, -5, -1, 3, 7, 10, 13, 15, 18, 20, 23, 26, 26, 26, 27, 28, 29, 31, 31, 32, 36, 36, 38, 42, 41, 35, 24, 17, 21, 22, 21, 19, 16, 13, 12, 10, 8, 6, 4, 3, 1, -0, -2, -3, -4, -4, -5, -7, -9, -9, -10, -11, -12, -10, -8, -14, -13, -12, -11, -11, -11, -12, -13, -13, + /* 39.0 */ -13, -12, -13, -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -12, -12, -12, -12, -13, -13, -13, -14, -14, -15, -15, -16, -17, -17, -18, -19, -21, -22, -22, -23, -24, -26, -27, -28, -30, -31, -32, -33, -34, -34, -35, -35, -36, -36, -37, -37, -37, -37, -37, -37, -37, -36, -36, -34, -30, -30, -27, -24, -25, -24, -22, -22, -21, -21, -20, -18, -18, -20, -18, -17, -14, -14, -16, -20, -22, -24, -25, -26, -27, -28, -30, -32, -33, -33, -33, -33, -33, -32, -32, -32, -33, -35, -35, -35, -34, -35, -34, -32, -33, -34, -33, -35, -36, -37, -37, -39, -40, -39, -38, -38, -38, -37, -36, -33, -32, -31, -27, -27, -25, -24, -22, -19, -16, -13, -10, -7, -3, -0, 2, 5, 8, 11, 14, 17, 20, 24, 27, 30, 33, 36, 39, 43, 45, 49, 52, 54, 56, 57, 58, 58, 58, 57, 56, 55, 54, 52, 51, 51, 49, 49, 49, 48, 49, 50, 51, 49, 49, 53, 54, 55, 55, 54, 54, 54, 53, 53, 52, 50, 49, 49, 47, 46, 45, 44, 44, 45, 46, 44, 43, 43, 43, 43, 43, 44, 37, 30, 29, 27, 28, 33, 38, 40, 40, 40, 40, 39, 40, 40, 39, 37, 37, 36, 36, 36, 34, 31, 30, 29, 28, 27, 26, 24, 21, 18, 14, 11, -0, -12, -17, -17, -18, -21, -20, -19, -21, -24, -27, -29, -31, -33, -34, -36, -37, -38, -36, -35, -36, -36, -35, -33, -30, -30, -36, -47, -51, -52, -51, -51, -54, -57, -59, -60, -62, -63, -63, -63, -58, -55, -55, -56, -56, -52, -51, -49, -47, -46, -48, -52, -52, -52, -51, -48, -45, -42, -39, -36, -32, -28, -25, -19, -16, -14, -13, -12, -9, -5, -1, 2, 6, 10, 13, 15, 17, 20, 23, 24, 23, 25, 25, 26, 28, 30, 31, 31, 33, 35, 37, 39, 41, 38, 25, 15, 20, 22, 21, 20, 18, 16, 13, 11, 9, 7, 5, 4, 2, 0, -1, -3, -4, -5, -6, -7, -9, -9, -10, -11, -13, -15, -13, -14, -13, -12, -12, -12, -12, -13, -13, -13, + /* 40.0 */ -13, -13, -12, -13, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -11, -11, -12, -12, -13, -13, -13, -13, -14, -15, -16, -16, -17, -18, -20, -21, -22, -22, -24, -25, -26, -28, -28, -30, -30, -31, -32, -33, -34, -34, -35, -35, -36, -36, -36, -37, -37, -36, -36, -35, -34, -31, -28, -28, -23, -23, -23, -23, -21, -20, -19, -19, -19, -18, -16, -18, -17, -16, -13, -12, -17, -19, -21, -23, -24, -25, -26, -27, -28, -30, -32, -33, -33, -33, -33, -33, -33, -33, -34, -35, -34, -34, -34, -35, -35, -34, -33, -35, -35, -35, -34, -34, -35, -35, -35, -35, -34, -34, -34, -34, -34, -33, -31, -30, -29, -27, -25, -23, -21, -18, -15, -12, -9, -6, -2, 1, 4, 7, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, 43, 46, 49, 52, 55, 57, 59, 59, 59, 60, 59, 58, 57, 56, 54, 54, 52, 51, 52, 51, 49, 48, 47, 46, 46, 46, 49, 54, 56, 55, 55, 54, 52, 52, 53, 52, 51, 50, 48, 49, 48, 45, 45, 44, 46, 48, 46, 44, 44, 44, 45, 46, 45, 38, 39, 34, 34, 36, 40, 40, 41, 40, 40, 40, 39, 38, 39, 39, 38, 37, 35, 34, 32, 30, 29, 30, 29, 29, 27, 26, 22, 20, 19, 11, 3, -8, -16, -21, -18, -15, -16, -15, -18, -21, -24, -26, -28, -30, -33, -34, -35, -36, -37, -38, -39, -41, -41, -42, -40, -39, -35, -35, -41, -45, -46, -50, -56, -60, -62, -62, -64, -66, -67, -67, -66, -66, -67, -66, -64, -63, -62, -59, -56, -55, -57, -57, -55, -54, -53, -50, -47, -45, -43, -40, -36, -32, -29, -25, -20, -16, -13, -11, -10, -8, -4, -1, 3, 5, 8, 11, 14, 17, 20, 24, 24, 23, 23, 24, 25, 26, 29, 30, 31, 31, 33, 34, 38, 40, 37, 24, 15, 17, 21, 21, 20, 18, 17, 15, 12, 10, 8, 6, 5, 3, 1, -0, -2, -3, -4, -6, -7, -8, -9, -10, -11, -13, -11, -15, -13, -12, -11, -12, -12, -13, -13, -12, -13, + /* 41.0 */ -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -12, -12, -12, -13, -14, -15, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -31, -32, -33, -33, -33, -33, -33, -32, -32, -32, -32, -32, -33, -30, -25, -25, -23, -22, -21, -20, -19, -18, -17, -17, -17, -17, -14, -13, -14, -16, -12, -11, -15, -18, -20, -21, -22, -23, -24, -26, -27, -28, -30, -32, -32, -33, -33, -33, -33, -33, -34, -35, -34, -36, -35, -34, -34, -35, -33, -34, -34, -33, -34, -32, -31, -32, -32, -31, -31, -29, -28, -30, -31, -30, -29, -28, -27, -26, -24, -21, -19, -16, -13, -10, -7, -4, -1, 3, 7, 9, 12, 16, 19, 21, 24, 27, 30, 34, 37, 40, 42, 45, 47, 50, 53, 55, 58, 59, 61, 61, 60, 60, 59, 58, 57, 56, 56, 54, 52, 52, 51, 51, 50, 49, 48, 48, 48, 49, 55, 56, 56, 56, 55, 54, 54, 53, 51, 50, 50, 49, 48, 46, 46, 45, 45, 46, 48, 47, 46, 46, 47, 48, 48, 48, 46, 40, 35, 37, 43, 44, 43, 42, 41, 41, 39, 38, 37, 36, 36, 36, 35, 34, 31, 28, 26, 25, 24, 24, 24, 25, 26, 23, 18, 11, 5, 5, -6, -16, -16, -11, -12, -13, -14, -17, -21, -25, -27, -28, -30, -32, -33, -34, -36, -37, -40, -42, -44, -41, -45, -49, -44, -38, -34, -34, -33, -35, -44, -54, -59, -61, -63, -65, -66, -65, -64, -62, -62, -62, -64, -63, -61, -61, -60, -58, -56, -56, -56, -56, -55, -53, -50, -48, -46, -42, -40, -38, -33, -28, -24, -21, -17, -14, -11, -8, -7, -3, 1, 3, 5, 7, 10, 14, 18, 21, 24, 26, 27, 24, 23, 24, 25, 26, 27, 28, 30, 30, 32, 35, 36, 29, 17, 11, 10, 16, 19, 19, 18, 17, 16, 14, 12, 10, 7, 6, 4, 2, 1, -1, -3, -4, -5, -6, -7, -8, -9, -11, -12, -7, -8, -13, -11, -11, -12, -12, -12, -12, -12, -12, + /* 42.0 */ -11, -11, -11, -11, -11, -10, -10, -9, -9, -9, -9, -9, -9, -8, -8, -9, -9, -10, -10, -10, -10, -11, -11, -12, -13, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -30, -31, -31, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30, -27, -24, -23, -21, -20, -19, -18, -17, -16, -15, -15, -15, -15, -14, -14, -14, -14, -13, -12, -14, -18, -19, -19, -21, -22, -24, -25, -25, -28, -29, -28, -32, -32, -33, -33, -34, -34, -34, -34, -34, -35, -36, -36, -35, -35, -33, -32, -33, -33, -31, -32, -30, -30, -29, -28, -28, -27, -26, -25, -27, -26, -26, -26, -26, -24, -23, -20, -17, -13, -10, -8, -6, -1, 4, 5, 9, 12, 15, 18, 21, 24, 26, 29, 32, 35, 38, 42, 44, 46, 48, 51, 53, 56, 58, 60, 62, 61, 61, 61, 60, 60, 59, 58, 57, 57, 55, 54, 54, 53, 51, 51, 50, 51, 52, 53, 56, 56, 57, 57, 54, 54, 54, 52, 50, 50, 50, 51, 50, 47, 47, 46, 46, 46, 51, 47, 48, 48, 49, 48, 46, 47, 44, 39, 37, 41, 45, 44, 45, 43, 41, 40, 40, 38, 34, 30, 28, 27, 28, 29, 27, 25, 22, 20, 19, 19, 18, 20, 20, 19, 14, 12, 9, -1, -8, -11, -12, -11, -12, -14, -17, -20, -23, -25, -27, -28, -29, -31, -33, -34, -35, -39, -41, -43, -43, -40, -36, -38, -37, -36, -35, -37, -38, -38, -38, -39, -44, -52, -56, -56, -57, -60, -63, -62, -64, -63, -62, -63, -63, -63, -61, -58, -56, -56, -56, -55, -54, -53, -50, -48, -46, -43, -40, -36, -33, -29, -26, -23, -19, -16, -11, -7, -5, -2, 0, 2, 4, 6, 8, 13, 18, 21, 23, 25, 26, 25, 23, 23, 24, 25, 26, 27, 28, 29, 30, 35, 33, 22, 21, 15, 11, 9, 10, 14, 16, 17, 16, 15, 13, 11, 9, 7, 5, 3, 2, -0, -1, -3, -4, -5, -6, -7, -8, -9, -12, -10, -11, -13, -11, -11, -11, -12, -12, -11, -11, -11, + /* 43.0 */ -10, -10, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, -9, -9, -10, -11, -11, -12, -12, -13, -14, -16, -17, -18, -19, -20, -21, -22, -22, -23, -24, -25, -26, -27, -28, -29, -30, -30, -30, -30, -31, -30, -30, -30, -29, -29, -29, -29, -24, -23, -21, -20, -19, -18, -18, -16, -16, -15, -14, -13, -12, -11, -10, -10, -14, -12, -14, -15, -15, -18, -19, -21, -24, -26, -27, -26, -27, -29, -29, -30, -31, -32, -34, -35, -35, -35, -34, -34, -34, -35, -36, -36, -37, -36, -35, -35, -34, -32, -32, -29, -28, -27, -27, -27, -26, -24, -25, -23, -22, -22, -21, -21, -20, -20, -18, -14, -10, -8, -7, -2, 4, 10, 13, 16, 17, 19, 20, 23, 26, 29, 31, 34, 37, 40, 43, 45, 47, 50, 52, 54, 56, 59, 61, 62, 62, 62, 62, 62, 62, 62, 61, 60, 58, 58, 58, 57, 56, 53, 51, 52, 55, 53, 54, 55, 57, 56, 56, 55, 54, 51, 50, 51, 52, 52, 51, 50, 50, 49, 48, 46, 46, 47, 49, 49, 48, 47, 43, 43, 43, 43, 43, 44, 46, 45, 44, 44, 42, 41, 40, 38, 36, 31, 29, 28, 26, 23, 21, 20, 19, 20, 18, 15, 17, 22, 23, 22, 17, 12, 5, -1, -6, -8, -9, -10, -12, -14, -17, -19, -20, -23, -25, -27, -28, -29, -32, -32, -34, -37, -39, -41, -42, -42, -40, -41, -41, -42, -44, -43, -42, -41, -42, -44, -47, -46, -48, -49, -51, -48, -49, -53, -62, -65, -63, -64, -64, -62, -57, -57, -60, -57, -56, -55, -53, -52, -50, -49, -46, -44, -43, -40, -38, -34, -31, -28, -25, -22, -18, -13, -8, -4, -2, -1, 1, 3, 5, 8, 11, 15, 19, 21, 22, 24, 25, 25, 26, 26, 27, 26, 26, 27, 28, 29, 32, 33, 30, 31, 28, 28, 21, 11, 3, 6, 12, 15, 14, 14, 12, 11, 9, 7, 5, 3, 1, 0, -2, -3, -5, -5, -6, -7, -8, -11, -8, -10, -11, -9, -10, -11, -11, -10, -10, -10, -10, + /* 44.0 */ -8, -8, -8, -7, -7, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -6, -6, -6, -7, -7, -8, -9, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -28, -29, -29, -29, -29, -29, -29, -28, -28, -28, -29, -28, -23, -22, -21, -19, -18, -18, -17, -17, -15, -13, -11, -11, -11, -9, -8, -10, -13, -10, -15, -15, -13, -17, -20, -23, -25, -25, -26, -26, -27, -28, -29, -29, -31, -33, -36, -37, -36, -36, -34, -34, -36, -35, -36, -36, -37, -37, -37, -36, -34, -31, -29, -29, -28, -27, -27, -26, -24, -24, -23, -23, -23, -21, -19, -18, -15, -13, -12, -11, -9, -7, -3, 3, 8, 12, 16, 17, 18, 20, 23, 25, 28, 30, 33, 35, 38, 40, 44, 46, 48, 51, 53, 55, 57, 59, 61, 63, 64, 64, 64, 64, 63, 63, 63, 61, 60, 58, 58, 58, 56, 55, 55, 53, 50, 47, 47, 51, 51, 49, 48, 50, 46, 47, 49, 49, 49, 49, 51, 52, 51, 50, 51, 52, 49, 46, 46, 45, 42, 41, 42, 43, 44, 46, 47, 46, 45, 44, 43, 40, 40, 39, 37, 36, 35, 33, 32, 29, 25, 22, 20, 17, 17, 15, 13, 16, 21, 20, 18, 14, 7, 2, -2, -5, -7, -9, -11, -12, -13, -15, -16, -18, -20, -23, -25, -27, -29, -30, -32, -34, -36, -37, -38, -39, -38, -39, -41, -42, -44, -44, -45, -45, -46, -47, -47, -49, -49, -51, -51, -52, -52, -56, -61, -66, -64, -60, -61, -60, -58, -59, -60, -62, -58, -56, -54, -53, -52, -51, -49, -47, -46, -44, -42, -40, -37, -35, -32, -28, -25, -22, -18, -14, -10, -6, -4, -2, 0, 2, 4, 7, 9, 13, 16, 19, 20, 22, 25, 25, 24, 25, 25, 27, 27, 26, 27, 28, 30, 31, 31, 32, 31, 31, 31, 30, 19, 2, -3, 2, 9, 11, 12, 11, 10, 8, 6, 4, 3, 2, -0, -1, -3, -4, -5, -5, -8, -11, -8, -11, -10, -9, -9, -10, -9, -9, -9, -8, -8, + /* 45.0 */ -6, -6, -6, -6, -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -4, -4, -5, -6, -7, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -24, -25, -26, -26, -27, -27, -28, -28, -28, -27, -26, -27, -26, -27, -27, -27, -23, -22, -20, -20, -19, -17, -16, -15, -15, -14, -13, -11, -9, -9, -7, -12, -11, -14, -15, -15, -15, -17, -20, -22, -23, -24, -25, -25, -27, -27, -28, -28, -31, -31, -34, -36, -37, -37, -36, -35, -36, -37, -37, -37, -37, -36, -35, -34, -34, -32, -30, -30, -28, -27, -26, -26, -25, -24, -23, -22, -21, -20, -18, -17, -15, -13, -10, -7, -4, -2, 3, 6, 10, 14, 17, 19, 21, 23, 26, 28, 30, 32, 34, 37, 39, 42, 44, 46, 49, 51, 53, 55, 57, 60, 61, 63, 65, 65, 65, 65, 64, 64, 63, 62, 61, 59, 59, 59, 59, 57, 55, 56, 54, 53, 51, 48, 46, 46, 45, 45, 44, 47, 48, 47, 47, 49, 51, 53, 53, 51, 52, 53, 45, 42, 39, 41, 43, 43, 44, 46, 46, 46, 46, 45, 44, 43, 43, 42, 38, 37, 34, 32, 33, 32, 31, 29, 27, 26, 26, 22, 18, 16, 14, 13, 13, 13, 11, 8, 4, 1, -2, -4, -6, -9, -11, -12, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -32, -33, -35, -37, -38, -38, -39, -41, -42, -43, -44, -44, -45, -47, -48, -50, -49, -45, -40, -44, -52, -56, -58, -63, -66, -67, -65, -61, -59, -57, -57, -57, -56, -53, -53, -51, -49, -49, -49, -49, -47, -47, -46, -44, -42, -40, -37, -34, -32, -29, -26, -22, -18, -15, -12, -8, -5, -2, 0, 2, 4, 6, 8, 11, 14, 16, 18, 20, 23, 24, 23, 24, 25, 29, 30, 26, 26, 27, 28, 29, 28, 28, 27, 26, 26, 26, 28, 24, 14, 1, -4, 3, 10, 12, 11, 10, 8, 6, 5, 3, 2, -0, -2, -3, -4, -5, -7, -10, -3, -10, -9, -8, -9, -7, -8, -7, -7, -7, -6, + /* 46.0 */ -5, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, -0, -1, -1, -0, -0, -1, -1, -2, -3, -4, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -20, -21, -22, -23, -24, -25, -25, -26, -26, -26, -26, -25, -25, -25, -25, -25, -26, -26, -23, -20, -20, -20, -20, -21, -18, -16, -16, -15, -13, -12, -12, -11, -11, -13, -14, -15, -16, -16, -16, -16, -19, -21, -22, -24, -25, -26, -27, -27, -27, -28, -28, -30, -31, -32, -34, -35, -36, -36, -37, -38, -38, -38, -37, -37, -36, -35, -34, -33, -33, -32, -29, -28, -26, -25, -25, -24, -22, -20, -19, -18, -17, -15, -13, -12, -9, -6, -2, 1, 4, 7, 10, 14, 18, 20, 24, 26, 29, 29, 31, 33, 35, 38, 40, 42, 45, 47, 49, 52, 53, 55, 57, 60, 61, 63, 65, 66, 66, 66, 65, 64, 63, 61, 61, 61, 60, 59, 59, 57, 55, 54, 52, 50, 49, 48, 47, 47, 47, 46, 48, 49, 48, 48, 48, 49, 50, 50, 50, 49, 49, 51, 52, 48, 49, 49, 48, 45, 47, 47, 46, 45, 45, 45, 44, 43, 42, 42, 41, 39, 37, 32, 31, 31, 29, 27, 25, 23, 22, 20, 17, 15, 13, 12, 11, 9, 7, 6, 3, 1, -1, -4, -6, -8, -10, -12, -15, -16, -18, -20, -22, -24, -26, -27, -29, -30, -31, -33, -35, -36, -37, -38, -39, -41, -41, -42, -43, -44, -44, -46, -48, -50, -51, -51, -51, -50, -52, -51, -51, -56, -60, -61, -60, -58, -54, -53, -51, -50, -49, -52, -50, -49, -49, -49, -48, -46, -45, -45, -44, -42, -41, -39, -36, -34, -32, -28, -25, -22, -19, -16, -13, -11, -7, -3, 0, 2, 4, 5, 7, 10, 12, 14, 17, 19, 20, 21, 22, 22, 24, 27, 29, 29, 26, 25, 26, 26, 26, 26, 24, 23, 23, 23, 23, 24, 25, 24, 17, 7, 4, 10, 12, 12, 10, 9, 7, 5, 3, 1, -1, -2, -3, -4, -7, -4, -5, -9, -7, -6, -6, -6, -6, -6, -5, -5, -5, + /* 47.0 */ -3, -3, -2, -1, -1, -1, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, -0, -1, -2, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -13, -14, -15, -16, -18, -19, -20, -21, -22, -22, -23, -24, -24, -24, -24, -23, -23, -23, -24, -24, -25, -24, -23, -21, -20, -18, -20, -20, -19, -17, -16, -15, -14, -13, -13, -12, -12, -12, -14, -15, -16, -16, -16, -17, -19, -21, -22, -24, -25, -26, -27, -28, -29, -30, -29, -31, -32, -33, -35, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -36, -35, -34, -33, -31, -29, -28, -28, -26, -24, -22, -21, -20, -19, -18, -17, -15, -14, -11, -8, -4, -0, 3, 6, 8, 11, 15, 17, 21, 25, 28, 32, 35, 36, 35, 36, 38, 41, 44, 46, 48, 50, 52, 54, 56, 57, 60, 62, 63, 65, 66, 66, 66, 65, 64, 62, 62, 62, 61, 60, 59, 58, 57, 56, 55, 53, 50, 50, 50, 49, 48, 48, 50, 50, 49, 49, 48, 48, 48, 48, 48, 48, 48, 50, 49, 48, 48, 49, 50, 50, 49, 48, 48, 47, 45, 45, 44, 43, 42, 42, 41, 39, 39, 36, 33, 33, 31, 29, 28, 25, 24, 22, 21, 20, 18, 15, 14, 11, 9, 7, 5, 2, -1, -4, -6, -8, -11, -14, -15, -16, -18, -19, -20, -21, -22, -23, -25, -27, -29, -30, -32, -34, -35, -35, -36, -37, -39, -39, -41, -42, -43, -44, -45, -46, -47, -47, -48, -49, -49, -49, -48, -47, -47, -48, -53, -54, -51, -47, -43, -45, -47, -49, -49, -48, -47, -46, -45, -44, -43, -44, -44, -43, -42, -40, -38, -35, -33, -31, -28, -26, -23, -20, -17, -15, -12, -8, -4, -1, 2, 4, 5, 7, 9, 12, 13, 16, 18, 19, 20, 20, 21, 23, 25, 26, 28, 27, 25, 24, 24, 25, 25, 22, 21, 20, 21, 21, 21, 22, 23, 25, 24, 16, 4, 10, 12, 12, 10, 9, 7, 5, 3, 1, 0, -1, -3, -7, -3, -4, -6, -5, -4, -5, -5, -4, -4, -4, -3, -3, + /* 48.0 */ -1, -0, -0, 1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 1, 1, -0, -1, -2, -3, -4, -4, -5, -7, -8, -9, -10, -11, -12, -14, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -22, -22, -22, -22, -22, -23, -23, -23, -20, -20, -22, -18, -18, -18, -17, -17, -16, -15, -15, -13, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -18, -21, -22, -24, -25, -27, -27, -28, -29, -31, -32, -31, -33, -35, -35, -36, -37, -37, -37, -37, -38, -38, -38, -38, -38, -36, -35, -33, -33, -32, -30, -28, -28, -27, -24, -22, -21, -20, -19, -18, -17, -16, -14, -9, -4, -2, 2, 5, 8, 9, 13, 17, 21, 25, 27, 29, 32, 35, 36, 36, 37, 40, 42, 44, 46, 49, 51, 52, 54, 56, 58, 60, 62, 63, 65, 66, 65, 65, 64, 63, 63, 63, 62, 62, 61, 60, 58, 57, 56, 55, 54, 53, 52, 52, 53, 54, 52, 51, 51, 50, 49, 48, 47, 46, 46, 46, 46, 47, 48, 49, 49, 48, 47, 46, 45, 45, 45, 46, 46, 44, 44, 44, 43, 41, 40, 39, 38, 36, 34, 34, 33, 31, 30, 28, 25, 24, 22, 21, 20, 18, 16, 14, 12, 9, 7, 4, 1, -3, -5, -9, -12, -13, -14, -16, -17, -18, -19, -20, -22, -21, -20, -22, -24, -27, -29, -31, -33, -33, -33, -34, -35, -36, -38, -40, -41, -41, -42, -43, -43, -43, -43, -43, -45, -46, -47, -50, -51, -51, -51, -49, -46, -43, -42, -44, -48, -49, -49, -48, -47, -46, -44, -44, -44, -44, -44, -43, -43, -41, -40, -37, -34, -32, -30, -28, -26, -23, -21, -18, -16, -13, -9, -6, -2, 2, 3, 5, 7, 9, 11, 14, 16, 17, 18, 19, 19, 20, 21, 22, 23, 25, 26, 26, 24, 22, 24, 23, 22, 22, 20, 20, 20, 20, 20, 21, 21, 24, 25, 15, 2, 7, 10, 10, 9, 8, 6, 5, 3, 2, 1, -2, -4, -0, -6, -3, -2, -3, -2, -2, -2, -2, -2, -2, -1, + /* 49.0 */ 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 5, 5, 5, 4, 3, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -11, -12, -13, -14, -16, -17, -18, -18, -19, -19, -20, -20, -20, -21, -21, -22, -21, -20, -17, -17, -21, -19, -17, -16, -16, -16, -16, -15, -15, -15, -14, -15, -15, -16, -16, -17, -17, -17, -18, -19, -19, -20, -21, -22, -23, -25, -27, -28, -29, -31, -32, -33, -34, -35, -36, -37, -38, -38, -39, -39, -38, -38, -39, -39, -39, -39, -38, -37, -36, -35, -34, -33, -30, -27, -27, -26, -24, -20, -19, -20, -20, -18, -16, -14, -10, -3, 2, 5, 7, 9, 12, 15, 22, 24, 22, 23, 26, 29, 33, 35, 37, 39, 41, 43, 45, 47, 50, 52, 53, 55, 56, 58, 60, 62, 64, 65, 65, 64, 64, 64, 63, 63, 63, 62, 61, 60, 59, 58, 57, 56, 56, 58, 58, 58, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 45, 45, 47, 47, 48, 48, 48, 48, 47, 46, 47, 47, 46, 46, 43, 43, 43, 43, 41, 39, 37, 33, 32, 34, 34, 33, 31, 28, 26, 23, 23, 21, 19, 17, 15, 13, 10, 10, 9, 7, 5, 1, -3, -5, -7, -9, -12, -14, -15, -16, -16, -16, -19, -21, -22, -20, -19, -22, -24, -27, -29, -31, -31, -31, -32, -33, -34, -35, -37, -38, -39, -40, -40, -40, -40, -40, -42, -44, -45, -45, -46, -47, -44, -44, -42, -41, -42, -43, -44, -46, -47, -46, -46, -45, -45, -45, -44, -43, -43, -42, -42, -41, -40, -39, -37, -34, -32, -30, -28, -25, -23, -21, -19, -16, -13, -10, -7, -3, 0, 3, 5, 7, 9, 11, 13, 14, 16, 16, 18, 19, 20, 20, 21, 21, 23, 24, 24, 23, 21, 22, 22, 21, 21, 20, 20, 20, 20, 21, 21, 21, 22, 25, 25, 12, 1, 4, 8, 9, 9, 8, 7, 5, 4, 2, -1, 1, 1, -2, 0, 0, -0, -0, 0, -0, 0, 0, 0, 0, + /* 50.0 */ -6, -6, -5, -4, -2, -1, 1, 2, 3, 5, 5, 7, 7, 8, 8, 9, 9, 8, 8, 8, 7, 7, 7, 6, 5, 5, 4, 3, 2, 1, -0, -1, -2, -3, -4, -5, -7, -8, -9, -10, -12, -13, -14, -15, -16, -17, -17, -17, -18, -18, -18, -20, -20, -16, -15, -17, -17, -17, -17, -16, -16, -16, -16, -16, -15, -14, -16, -17, -18, -17, -17, -17, -17, -19, -19, -19, -20, -20, -21, -23, -24, -25, -27, -28, -29, -30, -31, -33, -34, -35, -35, -36, -38, -39, -39, -40, -40, -39, -39, -39, -40, -40, -40, -39, -38, -36, -35, -33, -31, -29, -26, -25, -24, -24, -23, -23, -21, -19, -18, -16, -13, -10, -5, 1, 4, 8, 11, 13, 16, 22, 24, 23, 23, 26, 29, 32, 35, 38, 40, 42, 45, 47, 49, 51, 53, 54, 56, 57, 59, 61, 62, 63, 64, 64, 64, 63, 63, 63, 63, 63, 62, 61, 60, 58, 58, 57, 56, 57, 57, 59, 58, 58, 56, 55, 54, 53, 52, 50, 48, 46, 45, 45, 45, 45, 46, 47, 48, 49, 48, 48, 48, 47, 47, 47, 46, 45, 44, 44, 43, 42, 40, 37, 35, 33, 31, 32, 32, 32, 31, 29, 27, 25, 23, 21, 19, 16, 14, 12, 11, 11, 11, 10, 8, 5, 3, 0, -5, -7, -8, -10, -12, -14, -15, -15, -16, -17, -20, -21, -18, -17, -19, -22, -24, -26, -28, -29, -29, -30, -31, -32, -33, -34, -35, -35, -36, -38, -39, -40, -42, -44, -45, -45, -45, -44, -43, -43, -41, -41, -40, -41, -42, -42, -45, -46, -46, -46, -45, -43, -43, -42, -42, -41, -41, -40, -40, -40, -39, -37, -34, -32, -30, -27, -25, -23, -21, -19, -16, -14, -11, -8, -5, -1, 3, 5, 7, 9, 11, 12, 12, 13, 15, 17, 19, 20, 21, 21, 20, 21, 22, 23, 22, 21, 21, 22, 21, 19, 19, 19, 19, 20, 20, 21, 21, 22, 22, 24, 24, 16, 5, 2, 6, 8, 8, 8, 7, 5, 4, 3, 4, 1, 3, 2, 2, 1, 1, 1, 1, -1, -3, -5, -6, + /* 51.0 */ -8, -6, -7, -8, -10, -11, -11, -10, -7, -5, -2, 2, 5, 8, 9, 10, 10, 10, 10, 10, 10, 10, 9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 1, -0, -1, -3, -3, -5, -6, -8, -9, -10, -11, -13, -14, -14, -15, -15, -16, -17, -17, -16, -15, -15, -15, -15, -14, -14, -15, -15, -16, -16, -16, -16, -14, -13, -17, -18, -19, -19, -19, -20, -20, -21, -21, -21, -21, -22, -23, -25, -27, -28, -30, -31, -31, -32, -33, -34, -35, -36, -37, -38, -39, -40, -40, -40, -41, -42, -41, -41, -42, -42, -41, -39, -37, -36, -34, -33, -32, -29, -26, -24, -22, -21, -20, -19, -18, -17, -15, -13, -10, -8, -5, -2, 3, 9, 11, 14, 16, 20, 24, 24, 25, 27, 31, 34, 36, 39, 41, 43, 45, 48, 50, 52, 53, 55, 57, 58, 59, 61, 62, 63, 63, 63, 63, 63, 63, 63, 63, 62, 62, 60, 59, 58, 57, 59, 60, 58, 59, 60, 59, 58, 56, 55, 54, 54, 53, 51, 48, 46, 45, 45, 44, 45, 45, 45, 46, 47, 48, 48, 47, 46, 46, 44, 44, 43, 42, 41, 39, 38, 37, 36, 34, 31, 30, 30, 30, 30, 28, 25, 25, 25, 23, 20, 18, 16, 14, 13, 12, 11, 10, 9, 7, 6, 5, 3, -1, -4, -6, -8, -10, -11, -13, -14, -15, -17, -18, -18, -16, -16, -18, -20, -23, -24, -26, -27, -27, -28, -29, -30, -31, -32, -33, -35, -36, -38, -39, -40, -41, -42, -43, -43, -42, -42, -41, -41, -41, -40, -40, -40, -41, -42, -43, -43, -43, -43, -43, -43, -42, -40, -40, -39, -38, -38, -38, -38, -39, -37, -34, -32, -29, -27, -25, -23, -21, -19, -16, -14, -11, -8, -5, -2, 2, 4, 6, 8, 9, 10, 11, 12, 14, 16, 17, 18, 20, 20, 20, 19, 20, 21, 21, 20, 19, 20, 18, 17, 17, 18, 18, 18, 19, 19, 20, 22, 23, 23, 25, 25, 20, 6, 1, 5, 7, 8, 8, 8, 6, 6, 6, 5, 4, 3, 1, -1, -4, -5, -9, -10, -8, -5, -8, + /* 52.0 */ 4, 2, 4, 5, 7, 8, 7, 6, 6, 3, 2, -2, -3, -0, 2, 6, 8, 10, 11, 11, 11, 11, 11, 10, 10, 9, 9, 8, 7, 7, 6, 5, 4, 2, 1, 0, -1, -2, -4, -5, -7, -8, -9, -10, -11, -12, -12, -13, -14, -13, -14, -14, -14, -14, -13, -12, -13, -14, -14, -14, -15, -15, -15, -13, -12, -15, -18, -19, -20, -20, -20, -20, -21, -22, -22, -22, -23, -24, -24, -27, -30, -31, -32, -33, -33, -33, -34, -35, -36, -37, -39, -41, -42, -43, -43, -42, -43, -43, -43, -43, -44, -43, -42, -40, -39, -36, -34, -33, -31, -30, -28, -26, -23, -20, -18, -17, -16, -15, -13, -10, -8, -5, -1, 2, 4, 9, 12, 15, 17, 21, 22, 24, 26, 29, 32, 34, 36, 39, 42, 45, 47, 49, 50, 52, 54, 56, 57, 58, 60, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 61, 61, 59, 58, 57, 58, 61, 61, 60, 60, 59, 58, 58, 56, 56, 55, 54, 54, 52, 49, 48, 46, 45, 45, 44, 44, 43, 44, 44, 45, 45, 44, 44, 43, 42, 41, 40, 39, 37, 35, 33, 33, 32, 30, 29, 28, 28, 27, 26, 24, 21, 22, 23, 21, 20, 18, 16, 14, 13, 12, 11, 10, 8, 7, 7, 6, 4, 2, -0, -1, -3, -4, -6, -7, -8, -9, -12, -14, -14, -13, -13, -16, -18, -21, -23, -25, -25, -25, -26, -27, -28, -29, -30, -31, -33, -34, -36, -37, -39, -40, -41, -41, -41, -42, -43, -44, -43, -43, -42, -41, -39, -39, -40, -41, -42, -43, -41, -40, -40, -39, -38, -37, -37, -38, -38, -39, -40, -39, -36, -34, -32, -30, -27, -25, -23, -21, -19, -16, -14, -12, -9, -7, -4, -0, 2, 4, 6, 7, 8, 9, 11, 12, 14, 16, 18, 19, 19, 18, 18, 19, 20, 20, 19, 19, 18, 18, 16, 16, 17, 18, 19, 19, 20, 20, 21, 22, 23, 24, 24, 24, 12, 2, -1, 3, 7, 8, 9, 9, 8, 6, 3, 1, -3, -6, -2, 1, 5, 6, 4, 6, 6, 4, + /* 53.0 */ 5, 2, 2, 2, 3, 3, 5, 6, 8, 10, 13, 14, 14, 10, 4, 0, 0, 2, 4, 7, 9, 10, 11, 11, 12, 11, 11, 10, 9, 8, 7, 6, 6, 5, 3, 2, 1, -0, -2, -3, -5, -6, -7, -8, -9, -9, -11, -12, -9, -11, -12, -12, -13, -12, -11, -12, -12, -13, -13, -14, -14, -15, -14, -15, -16, -18, -20, -21, -22, -22, -22, -22, -22, -23, -24, -24, -25, -26, -27, -28, -30, -32, -33, -34, -34, -35, -36, -38, -39, -40, -41, -42, -43, -44, -45, -45, -45, -45, -45, -45, -45, -44, -43, -41, -39, -37, -34, -32, -30, -29, -27, -25, -23, -22, -19, -18, -16, -15, -14, -10, -7, -3, -0, 4, 7, 10, 13, 15, 19, 21, 23, 25, 28, 31, 34, 36, 39, 41, 44, 45, 47, 50, 51, 54, 56, 58, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 61, 60, 60, 60, 60, 60, 60, 59, 59, 60, 61, 60, 61, 60, 59, 58, 57, 56, 56, 55, 55, 53, 51, 49, 46, 45, 44, 43, 42, 42, 42, 41, 41, 41, 41, 41, 40, 39, 37, 36, 34, 33, 31, 30, 31, 30, 29, 28, 28, 27, 26, 24, 22, 20, 19, 19, 18, 17, 17, 16, 14, 12, 11, 10, 9, 8, 8, 7, 5, 5, 4, 3, 1, 0, -1, -2, -3, -4, -6, -9, -11, -12, -11, -12, -15, -17, -19, -20, -23, -24, -24, -25, -26, -27, -28, -29, -30, -32, -33, -35, -37, -38, -39, -39, -40, -40, -40, -41, -41, -42, -41, -40, -39, -39, -40, -41, -41, -40, -40, -40, -39, -38, -37, -36, -36, -37, -38, -38, -37, -36, -35, -35, -34, -31, -29, -27, -25, -23, -20, -19, -17, -15, -12, -10, -8, -6, -4, -2, 0, 2, 5, 6, 8, 9, 11, 13, 15, 17, 18, 18, 17, 18, 18, 18, 19, 19, 18, 18, 17, 16, 16, 17, 18, 18, 18, 19, 20, 21, 21, 23, 23, 24, 24, 21, 17, 5, -3, 1, 8, 10, 9, 5, 1, -3, -0, 3, 5, 7, 5, 2, 2, 1, 1, 2, 5, + /* 54.0 */ 5, -0, 2, 3, 4, 4, 5, 6, 7, 8, 10, 11, 13, 15, 18, 18, 16, 13, 8, 7, 8, 8, 8, 8, 9, 10, 11, 11, 11, 10, 11, 10, 9, 7, 5, 4, 3, 1, 0, -1, -2, -3, -4, -5, -6, -8, -9, -6, -8, -9, -9, -10, -10, -10, -11, -12, -12, -13, -14, -14, -14, -15, -15, -16, -18, -19, -20, -22, -23, -23, -24, -25, -25, -26, -26, -26, -27, -29, -30, -30, -31, -32, -34, -36, -37, -38, -39, -39, -40, -42, -43, -44, -45, -46, -46, -46, -45, -45, -45, -44, -44, -43, -42, -41, -39, -37, -35, -32, -31, -29, -27, -24, -23, -21, -20, -18, -18, -16, -15, -13, -9, -5, -1, 2, 6, 11, 14, 16, 18, 21, 24, 27, 30, 32, 35, 38, 40, 42, 44, 47, 49, 51, 53, 55, 58, 59, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 60, 60, 60, 61, 61, 61, 60, 59, 58, 58, 58, 59, 59, 59, 58, 58, 57, 56, 55, 54, 53, 51, 48, 46, 44, 43, 41, 41, 41, 40, 40, 39, 39, 40, 39, 39, 37, 36, 35, 34, 32, 30, 29, 29, 29, 28, 28, 27, 26, 25, 24, 23, 21, 20, 18, 17, 17, 16, 16, 15, 13, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 3, 2, 0, 0, -1, -3, -5, -8, -10, -11, -10, -10, -12, -14, -17, -18, -20, -22, -23, -24, -26, -27, -27, -28, -30, -31, -33, -34, -36, -37, -38, -38, -39, -39, -39, -39, -40, -39, -39, -40, -38, -36, -37, -39, -40, -39, -39, -38, -37, -36, -36, -37, -39, -40, -39, -38, -36, -34, -34, -33, -32, -33, -31, -27, -24, -22, -21, -19, -17, -15, -13, -11, -9, -8, -6, -4, -2, 1, 4, 5, 7, 8, 10, 12, 13, 14, 16, 17, 16, 16, 17, 17, 18, 17, 16, 17, 17, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20, 22, 22, 24, 25, 24, 22, 14, 5, -1, 4, 6, 2, 0, 2, 4, 4, 3, 2, 2, 2, 3, 3, 2, 2, 4, 5, + /* 55.0 */ -1, 1, 2, 3, 4, 5, 5, 6, 6, 7, 9, 10, 12, 14, 14, 16, 17, 17, 17, 18, 17, 16, 14, 13, 12, 10, 9, 10, 12, 12, 11, 9, 8, 7, 7, 6, 5, 3, 2, 1, 0, -1, -2, -3, -5, -7, -4, -4, -5, -6, -7, -8, -8, -9, -9, -10, -11, -12, -12, -14, -15, -16, -17, -17, -18, -19, -20, -22, -23, -24, -25, -26, -27, -28, -28, -29, -29, -31, -31, -32, -33, -34, -35, -37, -39, -40, -41, -42, -42, -43, -45, -46, -46, -47, -47, -46, -45, -45, -45, -44, -44, -44, -43, -41, -39, -37, -35, -33, -31, -29, -26, -24, -23, -20, -17, -16, -15, -13, -12, -11, -8, -4, -1, 3, 8, 13, 15, 16, 18, 22, 25, 28, 31, 34, 37, 39, 41, 43, 45, 47, 50, 52, 54, 56, 58, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 60, 60, 60, 61, 62, 62, 60, 58, 58, 57, 56, 56, 56, 58, 58, 58, 57, 56, 55, 54, 53, 51, 48, 46, 44, 43, 42, 42, 41, 41, 40, 41, 40, 40, 39, 37, 36, 34, 34, 33, 31, 29, 28, 27, 26, 25, 25, 25, 24, 23, 22, 21, 20, 19, 19, 17, 17, 16, 16, 15, 15, 14, 12, 11, 10, 9, 7, 6, 6, 6, 5, 4, 3, 2, 1, -0, -2, -4, -6, -8, -10, -9, -9, -10, -12, -14, -17, -18, -20, -22, -23, -24, -25, -26, -27, -29, -30, -32, -33, -34, -35, -35, -36, -36, -36, -36, -37, -37, -37, -38, -37, -35, -36, -38, -38, -38, -38, -37, -38, -38, -38, -38, -40, -40, -40, -39, -37, -35, -34, -33, -32, -32, -32, -30, -26, -25, -23, -20, -18, -17, -15, -13, -11, -9, -8, -6, -4, -2, 0, 2, 4, 5, 7, 9, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 15, 16, 16, 16, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 24, 25, 23, 22, 20, 14, 1, -1, 1, 8, 14, 9, 7, 5, 2, 2, 2, -0, -2, 1, 4, 4, 2, -1, + /* 56.0 */ 2, 2, 3, 3, 3, 3, 3, 4, 5, 8, 10, 12, 13, 13, 14, 14, 15, 15, 15, 16, 17, 16, 14, 13, 12, 13, 14, 11, 7, 6, 7, 8, 9, 9, 8, 8, 6, 6, 5, 3, 2, 1, -1, -2, -4, -1, -0, -1, -2, -2, -3, -6, -7, -7, -8, -8, -10, -11, -13, -14, -15, -16, -17, -18, -19, -20, -21, -23, -24, -25, -27, -28, -29, -29, -29, -30, -31, -31, -32, -33, -34, -35, -37, -38, -40, -41, -42, -43, -44, -45, -46, -48, -47, -48, -48, -48, -47, -47, -46, -45, -44, -44, -43, -41, -39, -37, -35, -33, -31, -29, -27, -26, -25, -21, -17, -15, -13, -11, -10, -9, -6, -0, 5, 6, 8, 11, 14, 17, 20, 23, 26, 28, 31, 34, 37, 39, 41, 43, 45, 47, 49, 52, 54, 56, 58, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 63, 63, 61, 61, 61, 61, 62, 62, 60, 58, 57, 55, 56, 57, 58, 58, 57, 56, 55, 54, 52, 50, 48, 47, 45, 45, 44, 43, 42, 42, 41, 41, 40, 39, 38, 37, 36, 35, 33, 32, 30, 28, 26, 25, 25, 24, 23, 23, 22, 21, 21, 20, 19, 19, 17, 17, 17, 17, 16, 15, 15, 14, 13, 12, 10, 9, 8, 8, 7, 6, 6, 5, 4, 3, 1, -1, -2, -5, -6, -7, -7, -7, -8, -8, -10, -13, -16, -18, -19, -20, -22, -23, -24, -25, -27, -28, -30, -31, -31, -32, -34, -34, -35, -35, -35, -35, -36, -36, -36, -36, -36, -37, -38, -38, -38, -38, -39, -39, -39, -40, -41, -41, -41, -40, -39, -38, -37, -36, -34, -34, -33, -32, -29, -28, -27, -26, -24, -22, -20, -18, -15, -11, -10, -9, -8, -7, -4, -2, -0, 2, 4, 6, 8, 10, 11, 12, 13, 13, 14, 15, 15, 15, 15, 14, 14, 15, 15, 16, 17, 18, 18, 18, 19, 19, 19, 18, 18, 18, 20, 21, 22, 24, 23, 21, 19, 15, 11, 7, 8, 9, 8, 8, 7, 6, 4, 2, 3, 1, 1, -0, -0, -0, 1, 2, + /* 57.0 */ 2, 2, 2, 3, 3, 2, 5, 10, 11, 11, 12, 12, 12, 13, 13, 14, 15, 15, 15, 15, 14, 15, 16, 15, 12, 12, 13, 14, 15, 14, 11, 8, 7, 8, 8, 8, 7, 6, 5, 4, 3, 1, 0, -1, 1, 2, 1, 1, 1, 1, -2, -3, -4, -5, -6, -8, -8, -10, -12, -13, -14, -15, -17, -19, -20, -22, -22, -23, -25, -26, -28, -29, -29, -30, -30, -31, -32, -33, -34, -35, -36, -38, -39, -41, -42, -43, -45, -46, -47, -47, -48, -48, -49, -49, -48, -48, -48, -48, -47, -45, -44, -44, -42, -41, -39, -37, -35, -33, -31, -29, -28, -27, -23, -20, -16, -13, -11, -10, -9, -7, -1, 4, 6, 8, 11, 13, 16, 18, 21, 24, 27, 29, 32, 34, 37, 39, 42, 44, 46, 47, 49, 51, 53, 55, 57, 60, 61, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 62, 62, 61, 60, 60, 60, 60, 60, 60, 57, 55, 56, 56, 58, 58, 57, 56, 55, 54, 52, 50, 48, 47, 46, 46, 44, 43, 43, 42, 41, 40, 39, 38, 38, 37, 36, 34, 32, 30, 28, 27, 25, 23, 22, 22, 21, 20, 21, 21, 20, 19, 19, 18, 16, 16, 17, 16, 14, 13, 13, 13, 13, 12, 11, 9, 9, 8, 9, 8, 7, 6, 5, 4, 2, 0, -1, -3, -5, -5, -5, -6, -6, -7, -10, -12, -14, -16, -18, -19, -21, -22, -23, -25, -26, -28, -29, -29, -30, -31, -32, -33, -34, -34, -34, -35, -35, -36, -36, -36, -37, -38, -38, -38, -39, -39, -39, -39, -40, -41, -40, -40, -40, -39, -38, -37, -36, -35, -35, -34, -34, -33, -30, -27, -24, -24, -23, -21, -19, -17, -15, -13, -12, -10, -10, -8, -5, -4, -2, 1, 4, 6, 7, 9, 10, 11, 11, 12, 12, 14, 15, 15, 15, 14, 14, 14, 15, 15, 16, 17, 17, 18, 18, 18, 17, 17, 16, 17, 18, 19, 20, 21, 21, 20, 19, 18, 15, 11, 10, 10, 9, 8, 7, 6, 5, 3, 2, 2, 2, 1, 1, 1, 2, 2, + /* 58.0 */ 2, 1, 1, 2, 4, 4, 7, 9, 9, 10, 11, 11, 12, 12, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 15, 13, 13, 12, 13, 14, 13, 10, 6, 6, 7, 7, 7, 5, 4, 3, 3, 2, 3, 4, 3, 2, 3, 2, 1, -0, -1, -2, -4, -5, -6, -9, -12, -13, -15, -15, -17, -19, -20, -21, -23, -24, -24, -26, -28, -29, -30, -31, -32, -32, -33, -34, -35, -36, -37, -38, -40, -41, -43, -44, -45, -46, -47, -48, -48, -48, -49, -49, -48, -48, -48, -47, -47, -46, -45, -44, -42, -41, -38, -37, -35, -33, -32, -30, -28, -28, -26, -22, -19, -16, -12, -9, -8, -7, -3, 3, 5, 6, 9, 11, 14, 17, 19, 22, 25, 27, 30, 32, 35, 38, 40, 42, 43, 45, 47, 49, 51, 52, 54, 56, 58, 60, 62, 63, 63, 63, 63, 63, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 60, 60, 60, 60, 57, 56, 56, 56, 58, 57, 57, 56, 55, 53, 50, 49, 49, 48, 47, 46, 45, 44, 43, 42, 42, 41, 39, 38, 37, 36, 34, 33, 31, 29, 27, 25, 22, 21, 20, 20, 20, 19, 19, 20, 19, 18, 17, 16, 15, 16, 15, 15, 15, 14, 14, 14, 13, 12, 11, 11, 10, 9, 9, 9, 8, 7, 6, 5, 4, 2, 1, -1, -2, -3, -3, -4, -5, -5, -8, -11, -13, -15, -16, -18, -20, -21, -22, -24, -25, -26, -27, -28, -29, -30, -30, -32, -33, -33, -34, -34, -35, -36, -36, -35, -35, -36, -37, -37, -38, -38, -37, -36, -38, -39, -40, -40, -40, -39, -37, -36, -35, -34, -34, -34, -33, -33, -32, -29, -27, -24, -22, -20, -19, -17, -16, -16, -14, -13, -11, -9, -7, -5, -2, 1, 2, 4, 6, 7, 8, 10, 10, 10, 11, 11, 12, 14, 15, 14, 13, 13, 13, 13, 14, 15, 15, 16, 16, 17, 17, 16, 16, 17, 16, 17, 19, 19, 18, 18, 19, 17, 15, 13, 10, 10, 9, 7, 6, 7, 6, 3, 2, 2, 1, 1, 1, 1, 1, 2, + /* 59.0 */ 1, 1, 4, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 12, 11, 10, 11, 13, 12, 11, 8, 7, 6, 6, 7, 8, 7, 5, 7, 9, 6, 5, 5, 3, 2, 2, 0, -1, -3, -4, -5, -8, -11, -12, -13, -15, -17, -18, -19, -20, -20, -21, -24, -27, -29, -30, -31, -32, -33, -33, -34, -35, -35, -36, -38, -40, -41, -42, -43, -45, -46, -48, -49, -49, -49, -49, -48, -48, -48, -48, -48, -47, -46, -46, -45, -44, -44, -42, -39, -36, -34, -33, -31, -29, -28, -27, -26, -24, -21, -18, -15, -11, -7, -5, -1, 3, 5, 5, 7, 10, 13, 15, 18, 21, 23, 25, 28, 31, 34, 36, 38, 40, 43, 45, 46, 47, 49, 50, 52, 53, 55, 57, 59, 61, 62, 63, 64, 64, 63, 63, 63, 62, 62, 61, 61, 61, 60, 61, 61, 60, 59, 59, 58, 56, 56, 55, 56, 55, 55, 57, 56, 55, 54, 52, 51, 48, 47, 47, 46, 45, 44, 44, 44, 45, 44, 42, 40, 38, 35, 33, 31, 29, 28, 26, 24, 21, 19, 18, 19, 20, 20, 19, 18, 17, 17, 16, 15, 15, 15, 16, 17, 16, 15, 14, 14, 14, 13, 13, 13, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 2, 1, 0, -1, -2, -3, -3, -5, -9, -10, -12, -14, -15, -17, -18, -20, -21, -22, -24, -25, -27, -28, -28, -29, -30, -31, -31, -32, -33, -33, -34, -34, -34, -35, -34, -35, -36, -37, -36, -35, -34, -34, -34, -34, -35, -36, -36, -36, -36, -36, -34, -32, -32, -32, -31, -31, -30, -29, -28, -27, -25, -23, -20, -19, -19, -19, -18, -16, -14, -11, -8, -6, -5, -3, -1, 0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 15, 16, 17, 18, 17, 17, 16, 16, 16, 16, 16, 17, 17, 17, 16, 14, 14, 12, 10, 7, 6, 6, 7, 5, 1, 0, 0, 0, -0, 0, 0, 1, 1, + /* 60.0 */ 0, 3, 5, 5, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 12, 13, 13, 15, 15, 15, 15, 15, 15, 15, 14, 13, 9, 11, 13, 13, 13, 12, 12, 12, 11, 10, 11, 10, 11, 12, 11, 10, 8, 7, 5, 4, 3, 2, 0, -1, -3, -4, -5, -7, -10, -12, -12, -14, -16, -17, -18, -20, -22, -24, -26, -28, -29, -30, -31, -32, -33, -34, -35, -36, -37, -39, -40, -41, -42, -43, -44, -46, -47, -48, -49, -50, -49, -48, -47, -46, -47, -47, -47, -45, -44, -43, -43, -42, -42, -41, -38, -35, -32, -30, -28, -27, -25, -24, -23, -21, -19, -17, -13, -8, -5, -2, 1, 4, 5, 7, 9, 11, 14, 17, 19, 22, 24, 27, 29, 30, 33, 36, 39, 41, 44, 45, 48, 48, 49, 50, 51, 52, 54, 56, 58, 60, 61, 63, 64, 64, 64, 64, 64, 63, 63, 62, 61, 61, 61, 60, 60, 60, 60, 60, 60, 58, 58, 57, 55, 56, 56, 55, 55, 54, 54, 53, 51, 49, 48, 47, 47, 45, 45, 45, 44, 45, 45, 42, 40, 39, 36, 33, 31, 29, 27, 25, 23, 20, 19, 19, 19, 20, 19, 18, 16, 16, 15, 15, 16, 16, 16, 16, 16, 16, 14, 12, 11, 12, 11, 11, 11, 11, 11, 10, 8, 7, 7, 7, 6, 5, 4, 3, 2, 0, -1, -2, -3, -3, -4, -8, -10, -11, -13, -15, -16, -17, -18, -20, -21, -23, -24, -25, -26, -26, -28, -28, -29, -30, -31, -31, -32, -32, -32, -32, -32, -32, -33, -34, -34, -33, -32, -31, -31, -33, -35, -35, -34, -34, -34, -34, -33, -33, -32, -31, -31, -31, -29, -28, -28, -28, -28, -28, -27, -26, -23, -20, -19, -18, -17, -15, -12, -10, -8, -6, -4, -3, -2, -1, 1, 2, 4, 4, 5, 5, 6, 9, 10, 11, 12, 13, 12, 13, 14, 14, 14, 14, 14, 15, 16, 17, 17, 17, 17, 16, 15, 14, 14, 14, 14, 15, 14, 13, 13, 13, 12, 11, 9, 8, 9, 4, -1, -1, -1, -2, -2, -1, -0, 0, 0, + /* 61.0 */ 5, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 15, 15, 15, 11, 6, 8, 12, 14, 16, 17, 18, 18, 16, 15, 17, 16, 13, 12, 10, 8, 7, 6, 5, 4, 3, 1, -0, -1, -2, -3, -5, -8, -11, -12, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -31, -32, -32, -33, -34, -35, -37, -38, -39, -41, -42, -43, -44, -45, -46, -48, -48, -49, -49, -49, -48, -47, -46, -46, -46, -45, -44, -43, -42, -40, -38, -37, -37, -35, -33, -31, -29, -27, -25, -24, -23, -22, -21, -20, -18, -13, -8, -3, -0, 3, 6, 8, 9, 11, 13, 16, 19, 21, 23, 25, 27, 29, 31, 33, 36, 38, 42, 46, 46, 48, 49, 49, 50, 51, 52, 53, 55, 56, 58, 60, 62, 63, 64, 65, 65, 65, 64, 64, 63, 63, 62, 61, 61, 60, 60, 60, 60, 59, 60, 59, 59, 58, 58, 57, 57, 55, 53, 52, 51, 51, 51, 49, 48, 47, 46, 45, 46, 46, 46, 45, 43, 40, 38, 36, 34, 32, 31, 29, 26, 23, 21, 20, 19, 19, 19, 19, 18, 17, 15, 15, 16, 16, 16, 16, 15, 15, 14, 13, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 8, 7, 7, 6, 5, 3, 3, 1, -0, -2, -3, -4, -3, -3, -6, -9, -10, -11, -13, -15, -17, -18, -19, -20, -21, -23, -24, -24, -25, -26, -27, -27, -28, -29, -29, -29, -29, -29, -29, -29, -29, -30, -31, -30, -30, -30, -30, -31, -32, -33, -34, -34, -34, -33, -33, -32, -31, -31, -30, -30, -30, -29, -28, -27, -26, -26, -26, -26, -26, -24, -21, -19, -19, -17, -15, -13, -11, -10, -8, -7, -6, -5, -3, -1, 0, 2, 3, 3, 4, 5, 8, 9, 11, 11, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 16, 15, 14, 13, 13, 14, 14, 14, 12, 11, 12, 12, 12, 11, 10, 10, 10, 8, 5, 3, 1, -1, -2, -0, 4, 5, + /* 62.0 */ 5, 5, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 14, 16, 15, 12, 10, 11, 16, 18, 18, 17, 17, 18, 18, 17, 15, 13, 12, 11, 9, 8, 7, 6, 5, 4, 2, 2, 1, 0, -1, -2, -4, -7, -11, -13, -14, -15, -18, -20, -22, -24, -26, -28, -29, -29, -30, -31, -32, -34, -34, -35, -37, -38, -40, -42, -42, -43, -44, -45, -46, -47, -48, -48, -48, -48, -48, -47, -46, -45, -44, -44, -43, -42, -40, -39, -38, -36, -34, -33, -31, -29, -27, -25, -24, -24, -23, -21, -19, -16, -13, -9, -5, -1, 2, 6, 10, 9, 10, 12, 15, 18, 20, 22, 23, 25, 29, 31, 33, 37, 42, 45, 48, 49, 47, 47, 50, 50, 50, 51, 52, 53, 54, 55, 57, 59, 60, 62, 63, 64, 65, 65, 65, 65, 64, 64, 64, 63, 62, 62, 61, 61, 60, 60, 60, 60, 60, 59, 59, 58, 57, 56, 54, 52, 50, 49, 50, 50, 49, 48, 47, 46, 45, 45, 46, 46, 45, 42, 39, 37, 35, 34, 32, 30, 27, 23, 22, 21, 19, 19, 19, 18, 18, 19, 19, 18, 18, 18, 17, 17, 16, 15, 14, 14, 14, 13, 12, 11, 12, 11, 11, 10, 9, 9, 8, 8, 7, 6, 4, 2, 1, -0, -1, -1, -2, -3, -3, -3, -6, -9, -10, -11, -11, -13, -15, -17, -18, -19, -20, -21, -22, -22, -23, -24, -25, -25, -25, -26, -27, -27, -28, -27, -27, -27, -27, -27, -27, -28, -29, -29, -29, -29, -29, -30, -30, -31, -31, -31, -31, -31, -30, -30, -29, -29, -29, -29, -28, -27, -25, -25, -24, -24, -23, -22, -20, -19, -22, -22, -18, -14, -12, -12, -11, -10, -9, -8, -6, -5, -3, -1, -0, 1, 1, 2, 4, 7, 8, 9, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 15, 14, 14, 13, 13, 13, 13, 13, 12, 11, 11, 11, 10, 10, 11, 11, 11, 10, 8, 6, 4, 2, 3, 5, 5, 5, + /* 63.0 */ 4, 5, 5, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 9, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 14, 16, 17, 15, 15, 16, 17, 17, 17, 16, 15, 13, 12, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 2, 1, 0, -1, -3, -5, -8, -11, -12, -14, -16, -18, -20, -22, -23, -25, -27, -27, -28, -29, -30, -31, -32, -34, -35, -36, -38, -39, -41, -42, -43, -44, -45, -45, -45, -45, -45, -45, -45, -44, -44, -43, -43, -42, -41, -41, -40, -39, -38, -37, -36, -35, -33, -32, -31, -29, -28, -26, -23, -20, -16, -13, -11, -9, -6, -4, -1, 2, 7, 10, 11, 12, 14, 16, 18, 20, 22, 25, 28, 30, 32, 37, 41, 44, 47, 49, 50, 48, 46, 48, 50, 50, 51, 52, 52, 53, 55, 56, 57, 59, 61, 62, 63, 64, 65, 65, 65, 65, 65, 65, 63, 63, 63, 62, 61, 61, 61, 62, 62, 61, 60, 60, 59, 57, 56, 54, 52, 51, 50, 50, 49, 48, 47, 47, 45, 45, 45, 45, 44, 42, 41, 40, 37, 35, 33, 32, 31, 29, 25, 22, 20, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 16, 15, 15, 15, 14, 14, 14, 13, 13, 12, 12, 11, 11, 11, 9, 9, 9, 9, 8, 6, 4, 2, 1, 1, 1, -0, -2, -2, -2, -3, -6, -8, -10, -11, -11, -12, -13, -14, -16, -17, -18, -19, -20, -21, -21, -22, -23, -23, -23, -24, -24, -24, -25, -24, -25, -26, -26, -26, -27, -26, -27, -27, -27, -28, -29, -29, -29, -29, -30, -30, -30, -29, -30, -30, -29, -29, -29, -28, -26, -25, -24, -24, -23, -22, -22, -23, -22, -20, -18, -18, -17, -15, -14, -14, -13, -13, -12, -11, -11, -10, -8, -7, -6, -5, -4, -2, 1, 5, 7, 8, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 11, 12, 13, 13, 13, 13, 13, 13, 12, 12, 11, 12, 12, 11, 10, 10, 10, 9, 9, 9, 8, 7, 7, 6, 5, 5, 5, 4, + /* 64.0 */ 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 10, 11, 12, 12, 12, 13, 14, 14, 15, 15, 14, 13, 13, 13, 12, 12, 11, 10, 10, 9, 8, 7, 6, 5, 5, 4, 3, 2, -0, -3, -6, -8, -9, -11, -13, -14, -16, -18, -19, -21, -22, -23, -24, -25, -27, -28, -29, -30, -32, -34, -34, -35, -37, -39, -40, -42, -43, -44, -44, -43, -43, -42, -41, -41, -40, -40, -40, -40, -39, -39, -38, -37, -37, -36, -35, -34, -34, -33, -32, -31, -29, -28, -26, -23, -20, -16, -13, -11, -8, -4, -2, -2, -1, 1, 7, 12, 14, 15, 16, 19, 21, 22, 26, 28, 28, 29, 33, 36, 40, 43, 46, 49, 50, 50, 48, 45, 47, 50, 52, 53, 54, 54, 54, 55, 56, 58, 59, 61, 62, 63, 65, 65, 65, 66, 66, 66, 67, 67, 66, 65, 65, 64, 63, 63, 62, 61, 60, 58, 57, 55, 53, 52, 52, 52, 51, 51, 50, 49, 47, 45, 43, 42, 43, 43, 42, 41, 41, 39, 36, 34, 32, 31, 30, 30, 28, 26, 24, 21, 19, 18, 17, 18, 18, 18, 18, 18, 18, 17, 16, 16, 16, 15, 15, 15, 14, 14, 13, 13, 12, 11, 10, 9, 9, 9, 8, 7, 6, 5, 4, 2, 1, -0, -1, -2, -3, -2, -2, -4, -6, -8, -10, -11, -12, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -21, -21, -21, -22, -22, -22, -22, -23, -24, -25, -25, -25, -25, -24, -24, -25, -27, -28, -28, -28, -28, -28, -29, -29, -29, -28, -27, -26, -26, -26, -25, -24, -23, -22, -21, -20, -20, -20, -20, -20, -19, -18, -18, -18, -17, -16, -16, -15, -14, -13, -11, -9, -10, -9, -6, -3, -0, 1, 3, 4, 5, 6, 6, 6, 7, 8, 9, 9, 9, 11, 11, 10, 10, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 6, 5, 4, 4, 4, 4, + /* 65.0 */ 5, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 8, 7, 7, 5, 3, 2, -0, -3, -7, -10, -11, -11, -13, -15, -16, -16, -18, -19, -20, -20, -22, -22, -24, -25, -26, -28, -29, -31, -33, -34, -34, -36, -37, -38, -39, -40, -41, -41, -41, -41, -40, -39, -38, -38, -38, -37, -37, -37, -37, -36, -35, -33, -33, -33, -33, -32, -32, -30, -28, -26, -25, -23, -21, -19, -16, -13, -11, -8, -6, -5, -2, 1, 3, 6, 12, 16, 18, 19, 20, 22, 26, 28, 27, 27, 29, 33, 37, 40, 43, 46, 48, 49, 49, 48, 45, 44, 46, 48, 51, 54, 56, 56, 56, 56, 58, 59, 59, 61, 63, 64, 64, 65, 66, 66, 67, 67, 67, 67, 67, 66, 66, 64, 63, 62, 61, 60, 58, 57, 56, 54, 53, 53, 52, 52, 51, 51, 50, 48, 46, 45, 44, 43, 41, 41, 40, 40, 39, 38, 36, 34, 32, 31, 30, 29, 27, 25, 23, 20, 19, 18, 18, 18, 18, 17, 18, 18, 17, 17, 17, 17, 17, 17, 17, 15, 13, 13, 12, 11, 10, 9, 8, 8, 7, 7, 6, 6, 5, 4, 2, 1, -0, -0, -2, -3, -2, -1, -2, -4, -6, -8, -10, -11, -11, -13, -13, -14, -15, -16, -17, -18, -18, -19, -19, -19, -19, -20, -21, -20, -20, -20, -21, -22, -23, -23, -23, -23, -22, -23, -25, -25, -25, -25, -25, -25, -24, -24, -25, -25, -24, -23, -22, -22, -22, -21, -20, -19, -18, -18, -17, -17, -18, -18, -18, -18, -17, -17, -17, -17, -17, -17, -16, -14, -10, -7, -5, -4, -4, -3, -2, -0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 9, 9, 9, 10, 9, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 9, 9, 7, 7, 7, 6, 6, 5, 5, 5, 5, 5, + /* 66.0 */ 5, 4, 4, 4, 4, 4, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 9, 9, 10, 10, 9, 9, 9, 9, 9, 9, 9, 8, 7, 6, 6, 4, 2, -0, -2, -4, -5, -6, -7, -7, -9, -10, -12, -13, -15, -16, -17, -18, -19, -19, -19, -20, -21, -23, -24, -25, -27, -29, -30, -32, -33, -34, -36, -36, -37, -38, -38, -39, -39, -39, -38, -37, -37, -36, -36, -36, -36, -35, -34, -34, -34, -33, -33, -32, -31, -30, -30, -29, -28, -28, -26, -24, -23, -21, -18, -16, -13, -11, -8, -5, -1, 3, 6, 8, 9, 13, 17, 19, 21, 22, 24, 27, 28, 30, 31, 32, 34, 36, 39, 42, 44, 45, 47, 48, 48, 48, 48, 49, 49, 51, 53, 55, 57, 58, 58, 59, 60, 60, 61, 61, 62, 63, 64, 65, 65, 65, 66, 66, 65, 65, 65, 64, 63, 63, 62, 60, 58, 58, 56, 54, 54, 53, 52, 52, 51, 51, 50, 49, 47, 46, 45, 44, 43, 43, 42, 41, 40, 39, 37, 35, 34, 33, 32, 31, 30, 29, 28, 25, 23, 22, 20, 20, 19, 18, 18, 18, 18, 17, 17, 18, 18, 17, 16, 15, 15, 15, 14, 13, 12, 12, 12, 10, 8, 6, 6, 7, 6, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -6, -5, -4, -6, -8, -10, -11, -12, -13, -14, -16, -17, -17, -17, -17, -17, -17, -17, -18, -19, -19, -19, -18, -19, -20, -21, -22, -22, -22, -22, -23, -23, -22, -22, -22, -23, -23, -22, -22, -22, -22, -21, -21, -20, -20, -19, -18, -17, -17, -16, -16, -15, -15, -15, -16, -15, -15, -15, -15, -14, -14, -15, -15, -14, -12, -8, -6, -4, -4, -5, -4, -3, -2, -1, -0, 1, 2, 3, 4, 5, 5, 5, 5, 7, 8, 8, 7, 5, 4, 5, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 9, 9, 8, 8, 8, 6, 6, 6, 6, 5, 5, 5, 5, + /* 67.0 */ 5, 5, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9, 9, 9, 9, 8, 7, 7, 7, 7, 7, 7, 7, 6, 5, 4, 4, 2, -0, -1, -2, -3, -4, -5, -5, -6, -8, -9, -10, -12, -13, -15, -16, -16, -17, -18, -19, -20, -22, -23, -25, -26, -28, -30, -31, -32, -33, -34, -35, -36, -36, -37, -37, -37, -37, -37, -36, -35, -34, -34, -33, -32, -31, -31, -32, -32, -31, -31, -30, -29, -28, -28, -27, -27, -26, -26, -24, -22, -21, -19, -16, -14, -10, -7, -3, 1, 6, 8, 7, 8, 11, 15, 18, 19, 21, 23, 25, 26, 26, 28, 30, 31, 33, 36, 39, 41, 43, 44, 46, 47, 48, 48, 49, 50, 53, 55, 56, 57, 57, 57, 57, 58, 58, 59, 60, 60, 60, 61, 62, 63, 63, 64, 64, 64, 64, 63, 63, 63, 62, 60, 59, 58, 57, 56, 55, 54, 53, 52, 52, 51, 51, 50, 49, 48, 48, 47, 45, 43, 43, 42, 43, 42, 41, 40, 38, 36, 33, 31, 30, 31, 31, 31, 30, 28, 26, 24, 23, 22, 20, 19, 18, 18, 18, 17, 17, 17, 17, 18, 18, 17, 16, 15, 14, 13, 12, 12, 11, 9, 8, 7, 8, 7, 6, 4, 3, 2, 1, 0, -0, -1, -2, -3, -4, -5, -7, -7, -6, -5, -5, -7, -8, -10, -12, -13, -14, -15, -15, -15, -15, -15, -15, -16, -16, -16, -17, -17, -17, -18, -17, -18, -18, -19, -20, -20, -19, -20, -20, -20, -20, -20, -19, -19, -20, -20, -19, -18, -18, -19, -19, -18, -18, -17, -17, -16, -15, -15, -14, -14, -13, -13, -12, -12, -12, -12, -12, -13, -14, -14, -11, -8, -5, -5, -5, -5, -5, -4, -3, -2, -2, -1, 0, 3, 3, 3, 3, 5, 6, 5, 2, 2, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 8, 8, 8, 7, 7, 6, 6, 6, 6, 6, 6, 5, + /* 68.0 */ 5, 4, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 5, 6, 8, 8, 7, 7, 8, 9, 9, 9, 9, 8, 8, 8, 7, 7, 6, 5, 4, 3, 2, 0, -2, -2, -2, -2, -3, -5, -6, -6, -7, -8, -8, -9, -10, -10, -11, -12, -15, -17, -18, -19, -21, -23, -25, -26, -28, -29, -30, -31, -32, -32, -33, -33, -34, -35, -35, -35, -35, -35, -35, -34, -34, -33, -32, -30, -30, -30, -30, -31, -31, -30, -28, -26, -26, -26, -26, -25, -24, -23, -22, -21, -19, -17, -14, -12, -9, -5, -2, 0, 2, 3, 6, 9, 12, 14, 17, 19, 22, 24, 25, 25, 25, 25, 26, 27, 29, 32, 34, 36, 38, 40, 42, 43, 45, 46, 47, 48, 49, 51, 54, 56, 56, 56, 56, 57, 58, 59, 59, 59, 59, 60, 59, 59, 60, 61, 61, 62, 62, 62, 62, 61, 61, 60, 59, 59, 58, 57, 56, 55, 54, 52, 51, 51, 51, 50, 49, 49, 48, 48, 48, 47, 45, 44, 42, 41, 41, 41, 41, 41, 39, 36, 32, 30, 30, 31, 32, 31, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 18, 18, 18, 18, 18, 17, 16, 15, 14, 13, 11, 11, 11, 10, 10, 9, 9, 8, 6, 5, 4, 3, 2, 1, -0, -1, -1, -2, -3, -3, -4, -5, -6, -7, -7, -6, -6, -7, -9, -11, -12, -13, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -16, -16, -16, -15, -16, -17, -17, -18, -18, -17, -17, -16, -16, -16, -17, -16, -16, -16, -17, -16, -16, -16, -16, -17, -16, -17, -16, -16, -15, -15, -15, -14, -13, -12, -12, -11, -11, -11, -11, -12, -14, -15, -16, -14, -10, -7, -5, -5, -5, -5, -4, -4, -3, -2, -1, 1, 1, 1, 2, 1, 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, + /* 69.0 */ 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 7, 7, 7, 5, 4, 3, 1, -2, -4, -5, -6, -6, -6, -6, -6, -7, -8, -8, -9, -9, -9, -8, -8, -9, -11, -12, -14, -15, -17, -18, -19, -20, -21, -22, -23, -26, -28, -30, -30, -31, -31, -32, -31, -31, -31, -32, -32, -32, -32, -31, -31, -30, -29, -28, -28, -28, -28, -28, -28, -27, -25, -24, -23, -24, -23, -22, -21, -21, -19, -17, -14, -11, -9, -6, -4, -2, -0, 1, 1, 4, 9, 13, 15, 16, 18, 21, 24, 25, 26, 27, 26, 24, 23, 24, 26, 29, 31, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51, 53, 55, 54, 55, 57, 59, 59, 60, 61, 61, 60, 59, 59, 59, 59, 59, 60, 60, 61, 61, 60, 60, 60, 59, 58, 58, 57, 56, 54, 52, 52, 51, 51, 50, 49, 49, 49, 48, 47, 47, 46, 45, 44, 43, 43, 41, 40, 39, 39, 39, 38, 37, 35, 33, 32, 31, 31, 30, 29, 28, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 17, 16, 15, 14, 13, 13, 12, 11, 10, 10, 9, 8, 8, 7, 6, 4, 4, 3, 2, 1, 0, -0, -1, -2, -3, -3, -4, -5, -5, -5, -6, -7, -7, -8, -8, -9, -10, -11, -11, -12, -12, -12, -12, -12, -13, -13, -13, -14, -14, -14, -15, -15, -15, -14, -14, -15, -16, -16, -15, -15, -15, -14, -14, -15, -15, -16, -17, -17, -16, -16, -15, -15, -15, -15, -14, -14, -13, -13, -12, -12, -12, -12, -12, -12, -11, -10, -10, -10, -12, -13, -14, -14, -13, -11, -7, -5, -5, -6, -5, -4, -4, -3, -2, -2, -1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + /* 70.0 */ 3, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, -0, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -1, -1, -2, -2, -2, -1, -2, -2, -2, -2, -3, -3, -3, -4, -4, -4, -4, -5, -6, -7, -7, -8, -9, -9, -10, -11, -11, -12, -13, -13, -14, -15, -17, -18, -18, -18, -18, -18, -19, -20, -22, -25, -27, -28, -28, -28, -28, -29, -29, -28, -28, -28, -28, -28, -27, -27, -26, -25, -25, -25, -26, -26, -26, -25, -25, -24, -22, -21, -21, -20, -20, -18, -17, -15, -13, -11, -8, -5, -2, -1, 1, 3, 4, 4, 5, 7, 10, 14, 16, 19, 21, 23, 24, 26, 27, 28, 28, 27, 26, 26, 27, 30, 32, 35, 36, 38, 39, 40, 42, 43, 44, 46, 47, 48, 50, 52, 54, 55, 55, 56, 57, 57, 57, 56, 57, 58, 58, 57, 56, 57, 58, 60, 59, 59, 59, 59, 59, 59, 59, 58, 57, 56, 55, 54, 52, 51, 51, 51, 51, 50, 50, 49, 48, 47, 47, 46, 45, 45, 44, 43, 43, 42, 41, 40, 39, 39, 38, 37, 35, 33, 31, 30, 28, 28, 27, 25, 24, 25, 24, 23, 21, 20, 19, 18, 17, 16, 15, 14, 14, 13, 12, 11, 10, 10, 9, 8, 7, 6, 6, 5, 4, 3, 2, 2, 1, -0, -1, -2, -2, -2, -2, -3, -4, -5, -6, -7, -7, -8, -8, -9, -9, -9, -10, -10, -10, -10, -10, -11, -11, -11, -12, -13, -13, -14, -14, -14, -14, -15, -14, -14, -13, -13, -13, -12, -12, -13, -14, -14, -15, -15, -15, -15, -15, -15, -15, -14, -13, -12, -11, -10, -9, -9, -10, -11, -11, -11, -11, -11, -11, -10, -10, -9, -8, -9, -9, -9, -10, -10, -10, -9, -7, -6, -6, -6, -5, -4, -3, -2, -2, -1, -1, -1, -1, -1, -1, -1, -0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, + /* 71.0 */ 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 0, -0, -0, -0, -0, -1, -1, -1, -1, -1, -1, -2, -2, -2, -3, -3, -4, -4, -4, -4, -3, -2, -3, -4, -5, -6, -6, -6, -6, -5, -5, -4, -3, -3, -4, -5, -7, -9, -10, -11, -12, -12, -13, -13, -14, -15, -15, -15, -16, -16, -17, -17, -17, -18, -19, -21, -23, -24, -25, -25, -25, -25, -25, -26, -26, -25, -24, -23, -23, -22, -21, -20, -19, -20, -21, -21, -21, -20, -20, -19, -18, -18, -17, -16, -15, -13, -12, -10, -8, -6, -4, -2, -0, 1, 2, 3, 3, 5, 8, 10, 12, 14, 16, 17, 19, 22, 24, 26, 26, 27, 28, 29, 28, 28, 28, 30, 32, 34, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 49, 50, 51, 52, 53, 53, 54, 55, 54, 54, 54, 54, 53, 53, 55, 56, 56, 57, 57, 56, 57, 57, 57, 57, 58, 57, 57, 56, 56, 55, 54, 54, 53, 53, 52, 52, 51, 50, 49, 48, 47, 46, 46, 45, 44, 44, 43, 42, 42, 41, 40, 40, 39, 37, 35, 33, 31, 29, 28, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 17, 16, 16, 15, 15, 13, 12, 11, 10, 9, 9, 8, 8, 8, 7, 6, 5, 3, 3, 2, 2, 1, 1, 0, -1, -1, -2, -3, -4, -5, -6, -7, -7, -7, -7, -8, -8, -8, -9, -9, -10, -10, -10, -10, -9, -9, -10, -11, -11, -12, -12, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -15, -15, -15, -14, -14, -13, -13, -12, -12, -12, -13, -13, -12, -11, -10, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -8, -8, -7, -7, -7, -7, -7, -8, -8, -8, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -2, -1, -1, -1, -1, -0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 2, 3, + /* 72.0 */ 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -0, -0, -0, 0, 0, 1, 0, 0, -0, -1, -1, -2, -2, -3, -3, -4, -6, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -6, -5, -4, -5, -7, -10, -11, -10, -10, -10, -9, -10, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -21, -22, -22, -22, -22, -23, -23, -22, -21, -20, -19, -18, -18, -18, -17, -16, -17, -17, -17, -16, -15, -14, -13, -13, -12, -11, -10, -9, -8, -8, -6, -4, -1, 1, 1, 2, 4, 7, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 26, 26, 25, 26, 27, 28, 30, 32, 34, 35, 36, 37, 37, 38, 39, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 49, 50, 50, 51, 51, 51, 51, 53, 54, 53, 53, 53, 53, 54, 55, 55, 54, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 51, 51, 50, 49, 49, 48, 47, 46, 45, 44, 43, 42, 42, 41, 41, 41, 40, 38, 36, 34, 33, 31, 29, 27, 26, 24, 23, 22, 21, 20, 19, 18, 18, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 7, 6, 6, 5, 4, 3, 3, 2, 2, 2, 1, -1, -2, -2, -3, -3, -4, -5, -5, -6, -6, -6, -7, -7, -7, -7, -8, -8, -8, -8, -8, -8, -8, -9, -10, -11, -11, -11, -11, -12, -12, -12, -13, -13, -13, -13, -13, -13, -14, -14, -14, -13, -13, -13, -13, -12, -13, -14, -14, -13, -12, -12, -11, -10, -10, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, + /* 73.0 */ 2, 2, 2, 1, 1, 0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -1, -1, -1, -2, -3, -4, -5, -6, -7, -8, -8, -8, -8, -8, -8, -7, -7, -7, -8, -8, -8, -8, -8, -8, -9, -9, -9, -9, -9, -8, -7, -7, -7, -8, -10, -10, -10, -10, -9, -9, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -20, -20, -20, -20, -20, -21, -20, -19, -18, -17, -16, -15, -15, -14, -13, -12, -12, -12, -12, -12, -11, -11, -11, -11, -10, -8, -6, -5, -5, -3, -1, 2, 3, 4, 6, 9, 12, 13, 13, 14, 14, 14, 15, 16, 17, 19, 22, 24, 22, 20, 20, 21, 22, 23, 24, 26, 29, 31, 32, 34, 36, 37, 37, 37, 37, 38, 39, 40, 41, 42, 42, 43, 45, 46, 47, 48, 48, 49, 49, 49, 48, 48, 49, 50, 50, 49, 50, 51, 51, 51, 52, 53, 53, 52, 51, 51, 50, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 49, 49, 49, 49, 49, 48, 48, 47, 46, 46, 45, 44, 43, 43, 42, 42, 41, 40, 37, 35, 33, 31, 30, 29, 28, 26, 24, 23, 22, 21, 20, 19, 18, 17, 17, 16, 16, 15, 14, 14, 13, 12, 10, 10, 9, 8, 7, 7, 6, 5, 4, 3, 3, 2, 2, 2, 2, 2, 1, -0, -2, -2, -3, -3, -4, -4, -4, -5, -5, -5, -6, -6, -6, -7, -7, -7, -7, -7, -8, -8, -9, -9, -9, -9, -9, -10, -10, -11, -11, -12, -12, -12, -11, -11, -11, -11, -11, -12, -13, -13, -13, -12, -12, -12, -12, -13, -13, -13, -12, -11, -11, -11, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, -7, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -4, -3, -3, -3, -3, -3, -2, -2, -1, -1, -1, -1, -0, -0, -0, -0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + /* 74.0 */ 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 1, 1, 0, 0, -0, -1, -3, -4, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -6, -5, -4, -4, -5, -6, -7, -7, -8, -9, -9, -9, -10, -10, -10, -9, -9, -7, -6, -5, -5, -7, -9, -9, -9, -9, -10, -10, -11, -12, -12, -13, -14, -15, -15, -15, -16, -16, -17, -17, -17, -17, -17, -17, -17, -16, -16, -15, -14, -13, -12, -12, -12, -11, -10, -10, -10, -10, -10, -10, -9, -8, -8, -7, -6, -5, -4, -3, -1, 1, 3, 6, 8, 11, 13, 14, 15, 15, 16, 16, 16, 17, 18, 20, 21, 20, 19, 18, 18, 20, 21, 22, 24, 25, 27, 29, 30, 32, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 50, 50, 51, 50, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 46, 45, 45, 45, 45, 45, 45, 44, 43, 43, 42, 41, 40, 39, 39, 38, 36, 35, 33, 31, 29, 28, 26, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 15, 14, 13, 12, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 2, 1, 0, -1, -2, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -5, -6, -6, -7, -7, -8, -8, -8, -8, -8, -9, -9, -9, -9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -11, -11, -11, -11, -11, -11, -10, -11, -11, -11, -10, -10, -9, -9, -9, -8, -8, -7, -7, -7, -7, -6, -6, -6, -5, -5, -5, -4, -4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 2, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + /* 75.0 */ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 1, 1, 0, -0, -1, -1, -2, -2, -2, -3, -4, -4, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -5, -6, -6, -7, -7, -8, -8, -9, -9, -9, -9, -8, -7, -6, -4, -3, -4, -6, -8, -10, -10, -11, -11, -11, -12, -12, -12, -12, -11, -11, -12, -12, -12, -13, -13, -14, -14, -14, -14, -14, -14, -13, -12, -12, -11, -10, -9, -9, -8, -7, -7, -7, -6, -5, -4, -3, -2, -1, 1, 2, 4, 6, 7, 7, 6, 5, 7, 9, 12, 14, 15, 16, 17, 18, 18, 19, 19, 19, 19, 18, 18, 17, 17, 18, 19, 20, 21, 22, 23, 25, 27, 28, 30, 31, 32, 32, 33, 33, 34, 35, 36, 36, 36, 37, 37, 38, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 45, 45, 46, 47, 47, 47, 45, 44, 44, 44, 45, 45, 46, 47, 47, 47, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 44, 43, 42, 42, 41, 41, 40, 40, 40, 40, 40, 37, 35, 33, 31, 30, 29, 28, 27, 26, 24, 23, 22, 21, 21, 20, 19, 18, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 9, 8, 7, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 3, 3, 2, 1, -1, -2, -2, -3, -3, -4, -4, -4, -4, -5, -5, -5, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -0, -0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + /* 76.0 */ 2, 2, 2, 1, -0, -1, -0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -2, -3, -3, -3, -3, -3, -3, -3, -4, -4, -4, -5, -5, -6, -6, -6, -7, -7, -8, -8, -8, -8, -8, -7, -6, -5, -5, -5, -5, -5, -6, -7, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -9, -10, -10, -10, -10, -10, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -6, -5, -5, -4, -3, -2, -2, -2, -1, -1, -1, -0, 1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 19, 19, 20, 21, 21, 22, 24, 25, 27, 28, 29, 30, 31, 31, 32, 32, 32, 33, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 47, 46, 44, 42, 40, 39, 38, 38, 38, 38, 38, 38, 39, 41, 42, 42, 43, 43, 44, 45, 44, 44, 43, 43, 43, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 42, 42, 41, 41, 40, 39, 40, 40, 39, 37, 34, 32, 31, 30, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 18, 17, 16, 15, 14, 13, 12, 11, 11, 10, 10, 9, 8, 8, 7, 7, 6, 5, 5, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 1, 1, -0, -1, -1, -2, -3, -3, -4, -4, -5, -5, -5, -6, -6, -7, -7, -7, -6, -6, -6, -7, -7, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -8, -8, -8, -8, -8, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -0, -0, -1, -0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 2, + /* 77.0 */ 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 0, -0, -1, -1, -1, -1, -2, -2, -3, -3, -2, -3, -3, -4, -4, -4, -5, -5, -6, -6, -6, -6, -7, -7, -7, -7, -7, -6, -6, -6, -5, -4, -3, -3, -3, -3, -4, -5, -5, -5, -5, -5, -6, -6, -6, -7, -7, -8, -8, -8, -8, -8, -8, -7, -7, -6, -7, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -3, -3, -2, -1, -0, 1, 3, 5, 6, 6, 7, 7, 8, 9, 9, 9, 9, 9, 10, 10, 11, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 23, 24, 24, 24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 31, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 42, 42, 43, 43, 43, 43, 42, 41, 39, 36, 33, 31, 31, 33, 33, 33, 33, 33, 34, 36, 38, 39, 40, 40, 41, 42, 42, 42, 42, 41, 41, 41, 41, 42, 41, 41, 41, 42, 42, 41, 41, 40, 40, 40, 39, 38, 38, 37, 35, 33, 32, 30, 30, 29, 29, 28, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 17, 16, 15, 15, 14, 13, 13, 12, 11, 11, 10, 9, 9, 8, 7, 7, 6, 6, 5, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 0, -1, -2, -2, -3, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -6, -6, -7, -7, -7, -7, -7, -7, -7, -6, -5, -5, -5, -4, -4, -4, -4, -4, -3, -2, -2, -2, -2, -2, -2, -1, -0, -0, 0, 0, -0, -0, -1, -0, 0, 0, 1, 1, 1, 2, 2, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, + /* 78.0 */ 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 3, 3, 2, 2, 1, 0, 0, -0, -0, -0, -1, -2, -3, -3, -3, -3, -3, -3, -4, -4, -4, -5, -5, -5, -5, -5, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -4, -4, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -2, -1, -1, -1, -1, -1, -1, -1, -0, 1, 2, 4, 5, 6, 8, 9, 10, 10, 10, 10, 9, 9, 9, 9, 10, 12, 14, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 39, 38, 37, 36, 35, 34, 32, 31, 30, 29, 30, 30, 31, 31, 31, 31, 31, 33, 35, 36, 36, 36, 37, 38, 39, 40, 39, 39, 38, 38, 38, 39, 39, 39, 40, 40, 40, 39, 39, 39, 39, 38, 37, 35, 34, 32, 32, 32, 31, 30, 29, 29, 29, 28, 27, 26, 24, 24, 23, 22, 21, 20, 19, 19, 18, 17, 17, 16, 16, 15, 14, 14, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8, 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 2, 1, 1, 0, -0, -0, -1, -1, -1, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -5, -5, -5, -5, -5, -5, -4, -3, -3, -2, -2, -2, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -1, -0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, + /* 79.0 */ 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, -0, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -2, -1, -1, -0, 0, 1, 1, 0, -0, -1, -1, -1, -1, -1, -1, -1, -0, 0, 1, 1, 1, 0, 1, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 5, 5, 5, 5, 6, 8, 9, 10, 11, 11, 11, 10, 8, 8, 7, 7, 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 36, 35, 34, 33, 32, 31, 30, 29, 29, 28, 28, 29, 29, 30, 30, 30, 30, 31, 31, 32, 33, 34, 35, 36, 37, 37, 36, 36, 35, 36, 36, 37, 37, 37, 37, 38, 38, 39, 39, 38, 38, 37, 37, 36, 35, 35, 35, 34, 33, 32, 30, 29, 28, 28, 27, 26, 25, 24, 24, 23, 22, 22, 21, 20, 20, 19, 18, 18, 17, 17, 16, 15, 15, 14, 14, 14, 13, 13, 12, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -1, -1, -0, 0, 0, 1, 1, 1, 1, 1, -0, -1, -2, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, + /* 80.0 */ 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, 0, 1, 2, 2, 3, 4, 4, 5, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 3, 3, 4, 5, 5, 6, 8, 9, 10, 11, 11, 11, 10, 9, 8, 8, 8, 9, 10, 12, 13, 15, 15, 15, 15, 14, 13, 12, 10, 9, 8, 7, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 37, 37, 37, 36, 36, 35, 34, 33, 33, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 32, 32, 32, 32, 33, 34, 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 33, 33, 32, 31, 30, 30, 29, 29, 29, 28, 27, 27, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 20, 20, 19, 18, 18, 17, 17, 16, 16, 16, 15, 14, 14, 13, 13, 12, 12, 11, 11, 11, 11, 11, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 0, -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, 0, 0, -0, -0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 0, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, + /* 81.0 */ 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 17, 16, 16, 16, 17, 17, 18, 19, 19, 19, 18, 17, 15, 14, 12, 12, 11, 12, 12, 14, 15, 16, 18, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 34, 35, 35, 34, 34, 34, 35, 35, 35, 35, 35, 34, 33, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 33, 33, 33, 32, 31, 31, 31, 31, 32, 32, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 29, 29, 28, 28, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 21, 21, 20, 20, 19, 19, 18, 18, 18, 18, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 14, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, + /* 82.0 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 18, 17, 17, 16, 16, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 21, 22, 24, 25, 26, 27, 29, 29, 30, 31, 31, 31, 32, 32, 32, 32, 32, 32, 31, 31, 30, 30, 29, 29, 28, 27, 27, 27, 27, 27, 28, 29, 30, 31, 31, 32, 32, 31, 31, 30, 30, 29, 29, 29, 29, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 31, 31, 31, 30, 30, 29, 28, 28, 27, 27, 26, 26, 26, 26, 25, 24, 24, 23, 23, 22, 22, 22, 22, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 15, 14, 13, 12, 12, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 7, 7, 8, 8, 8, 8, 8, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + /* 83.0 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 22, 22, 22, 21, 21, 21, 21, 20, 20, 19, 19, 19, 18, 18, 18, 18, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 7, 6, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, + /* 84.0 */ 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 22, 22, 22, 22, 21, 21, 21, 21, 20, 20, 20, 19, 19, 19, 19, 18, 18, 18, 18, 17, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + /* 85.0 */ 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 9, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + /* 86.0 */ 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 23, 23, 22, 22, 22, 21, 21, 21, 21, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + /* 87.0 */ 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + /* 88.0 */ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + /* 89.0 */ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + /* 90.0 */ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 +}; +#endif // HEIGHTGRID_H_INCLUDED_ diff --git a/interpolate.cc b/interpolate.cc index 9407ea4e8..3ef03195b 100644 --- a/interpolate.cc +++ b/interpolate.cc @@ -22,38 +22,13 @@ #include "defs.h" #include "filterdefs.h" #include "grtcirc.h" +#include "interpolate.h" #include #if FILTERS_ENABLED #define MYNAME "Interpolate filter" -static char* opt_interval = nullptr; -static unsigned int interval = 0; -static char* opt_dist = nullptr; -static double dist = 0; -static char* opt_route = nullptr; - -static -arglist_t interpfilt_args[] = { - { - "time", &opt_interval, "Time interval in seconds", nullptr, - ARGTYPE_BEGIN_EXCL | ARGTYPE_BEGIN_REQ | ARGTYPE_INT, - "0", nullptr, nullptr - }, - { - "distance", &opt_dist, "Distance interval in miles or kilometers", - nullptr, ARGTYPE_END_EXCL | ARGTYPE_END_REQ | ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - { - "route", &opt_route, "Interpolate routes instead", nullptr, - ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -static void -interpfilt_process() +void InterpolateFilter::process() { queue* backuproute = nullptr; queue* elem, *tmp, *elem2, *tmp2; @@ -116,8 +91,9 @@ interpfilt_process() frac, &wpt_new->latitude, &wpt_new->longitude); - if (altitude1 != unknown_alt && wpt->altitude != unknown_alt) + if (altitude1 != unknown_alt && wpt->altitude != unknown_alt) { wpt_new->altitude = altitude1 + frac * (wpt->altitude - altitude1); + } if (opt_route) { route_add_wpt(rte_new, wpt_new); } else { @@ -145,8 +121,9 @@ interpfilt_process() frac, &wpt_new->latitude, &wpt_new->longitude); - if (altitude1 != unknown_alt && wpt->altitude != unknown_alt) + if (altitude1 != unknown_alt && wpt->altitude != unknown_alt) { wpt_new->altitude = altitude1 + frac * (wpt->altitude - altitude1); + } if (opt_route) { route_add_wpt(rte_new, wpt_new); } else { @@ -172,8 +149,7 @@ interpfilt_process() xfree(backuproute); } -static void -interpfilt_init(const char*) +void InterpolateFilter::init() { char* fm; @@ -194,11 +170,4 @@ interpfilt_init(const char*) } } -filter_vecs_t interpolatefilt_vecs = { - interpfilt_init, - interpfilt_process, - nullptr, - nullptr, - interpfilt_args -}; #endif // FILTERS_ENABLED diff --git a/interpolate.h b/interpolate.h new file mode 100644 index 000000000..017c060da --- /dev/null +++ b/interpolate.h @@ -0,0 +1,67 @@ +/* + Interpolate filter + + Copyright (C) 2002 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef INTERPOLATE_H_INCLUDED_ +#define INTERPOLATE_H_INCLUDED_ + +#include "defs.h" // for ARG_NOMINMAX, arglist_t, ARGTYPE_BEGIN_EXCL, ARG... +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class InterpolateFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + +private: + char* opt_interval = nullptr; + unsigned int interval = 0; + char* opt_dist = nullptr; + double dist = 0; + char* opt_route = nullptr; + + arglist_t args[4] = { + { + "time", &opt_interval, "Time interval in seconds", nullptr, + ARGTYPE_BEGIN_EXCL | ARGTYPE_BEGIN_REQ | ARGTYPE_INT, + "0", nullptr, nullptr + }, + { + "distance", &opt_dist, "Distance interval in miles or kilometers", + nullptr, ARGTYPE_END_EXCL | ARGTYPE_END_REQ | ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + { + "route", &opt_route, "Interpolate routes instead", nullptr, + ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + +}; +#endif // FILTERS_ENABLED +#endif // INTERPOLATE_H_INCLUDED_ diff --git a/main.cc b/main.cc index 195df5047..62a632d04 100644 --- a/main.cc +++ b/main.cc @@ -204,7 +204,7 @@ main(int argc, char* argv[]) int argn; ff_vecs_t* ivecs = nullptr; ff_vecs_t* ovecs = nullptr; - filter_vecs_t* fvecs = nullptr; + Filter* filter = nullptr; QString fname; QString ofname; const char* ivec_opts = nullptr; @@ -487,17 +487,13 @@ main(int argc, char* argv[]) break; case 'x': optarg = FETCH_OPTARG; - fvecs = find_filter_vec(CSTR(optarg), &fvec_opts); + filter = find_filter_vec(CSTR(optarg), &fvec_opts); - if (fvecs) { - if (fvecs->f_init) { - fvecs->f_init(fvec_opts); - } - fvecs->f_process(); - if (fvecs->f_deinit) { - fvecs->f_deinit(); - } - free_filter_vec(fvecs); + if (filter) { + filter->init(); + filter->process(); + filter->deinit(); + free_filter_vec(filter); } else { fatal("Unknown filter '%s'\n",qPrintable(optarg)); } diff --git a/nukedata.cc b/nukedata.cc index 3dc342d3b..aad78ce8f 100644 --- a/nukedata.cc +++ b/nukedata.cc @@ -22,31 +22,12 @@ #include "defs.h" #include "filterdefs.h" +#include "nukedata.h" #if FILTERS_ENABLED #define MYNAME "nukedata" -static char* nukewpts, *nuketrks, *nukertes; - -static -arglist_t nuke_args[] = { - { - "waypoints", &nukewpts, "Remove all waypoints from data stream", - "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - } , - { - "tracks", &nuketrks, "Remove all tracks from data stream", - "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - } , - { - "routes", &nukertes, "Remove all routes from data stream", - "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - } , - ARG_TERMINATOR -}; - -static void -nuke_process(void) +void NukeDataFilter::process(void) { if (*nukewpts != '0') { waypt_flush_all(); @@ -59,12 +40,4 @@ nuke_process(void) } } -filter_vecs_t nuke_vecs = { - nullptr, - nuke_process, - nullptr, - nullptr, - nuke_args -}; - #endif diff --git a/nukedata.h b/nukedata.h new file mode 100644 index 000000000..8d00fd0b0 --- /dev/null +++ b/nukedata.h @@ -0,0 +1,64 @@ +/* + + nukedata: remove all (waypoint|tracks|routes) from the stream. + + Copyright (C) 2005 Robert Lipe robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef NUKEDATA_H_INCLUDED_ +#define NUKEDATA_H_INCLUDED_ + +#include "defs.h" // for ARGTYPE_BOOL, ARG_NOMINMAX, arglist_t, ARG_TERMI... +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class NukeDataFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void process() override; + +private: + char* nukewpts; + char* nuketrks; + char* nukertes; + + arglist_t args[4] = { + { + "waypoints", &nukewpts, "Remove all waypoints from data stream", + "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "tracks", &nuketrks, "Remove all tracks from data stream", + "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "routes", &nukertes, "Remove all routes from data stream", + "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + +}; + +#endif +#endif // NUKEDATA_H_INCLUDED_ diff --git a/polygon.cc b/polygon.cc index 98dec26e4..670ac4c73 100644 --- a/polygon.cc +++ b/polygon.cc @@ -20,14 +20,12 @@ */ #include "defs.h" #include "filterdefs.h" +#include "polygon.h" #include #if FILTERS_ENABLED #define MYNAME "Polygon filter" -static char* polyfileopt = nullptr; -static char* exclopt = nullptr; - /* * This test for insideness is essentially an odd/even test. The * traditional (simple) implementation of the odd/even test counts @@ -103,28 +101,10 @@ static char* exclopt = nullptr; #define BEGIN_HOR 32 #define UP 64 -typedef struct { - unsigned short state; - unsigned short override; -} extra_data; - -static -arglist_t polygon_args[] = { - { - "file", &polyfileopt, "File containing vertices of polygon", - nullptr, ARGTYPE_FILE | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr - }, - { - "exclude", &exclopt, "Exclude points inside the polygon", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -static void polytest(double lat1, double lon1, - double lat2, double lon2, - double wlat, double wlon, - unsigned short* state, int first, int last) +void PolygonFilter::polytest(double lat1, double lon1, + double lat2, double lon2, + double wlat, double wlon, + unsigned short* state, int first, int last) { if (lat1 == wlat) { @@ -233,8 +213,7 @@ static void polytest(double lat1, double lon1, #define BADVAL 999999 -static void -polygon_process() +void PolygonFilter::process() { queue* elem, * tmp; Waypoint* waypointp; @@ -271,7 +250,7 @@ polygon_process() } else if (lat1 != BADVAL && lon1 != BADVAL && lat2 != BADVAL && lon2 != BADVAL) { #if NEWQ - foreach(Waypoint* waypointp, waypt_list) { + foreach (Waypoint* waypointp, waypt_list) { #else QUEUE_FOR_EACH(&waypt_head, elem, tmp) { waypointp = (Waypoint*)elem; @@ -320,7 +299,7 @@ polygon_process() gbfclose(file_in); #if NEWQ - foreach(Waypoint* wp, waypt_list) { + foreach (Waypoint* wp, waypt_list) { #else QUEUE_FOR_EACH(&waypt_head, elem, tmp) { Waypoint* wp = (Waypoint*) elem; @@ -340,23 +319,4 @@ polygon_process() } } -static void -polygon_init(const char*) -{ - /* do nothing */ -} - -static void -polygon_deinit() -{ - /* do nothing */ -} - -filter_vecs_t polygon_vecs = { - polygon_init, - polygon_process, - polygon_deinit, - nullptr, - polygon_args -}; #endif // FILTERS_ENABLED diff --git a/polygon.h b/polygon.h new file mode 100644 index 000000000..7dde6e793 --- /dev/null +++ b/polygon.h @@ -0,0 +1,67 @@ +/* + Inside/Outside polygon filter + + Copyright (C) 2002 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef POLYGON_H_INCLUDED_ +#define POLYGON_H_INCLUDED_ + +#include "defs.h" // for ARG_NOMINMAX, arglist_t, ARGTYPE_BOOL, ARGTYPE_FILE +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class PolygonFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void process() override; + +private: + char* polyfileopt = nullptr; + char* exclopt = nullptr; + + typedef struct { + unsigned short state; + unsigned short override; + } extra_data; + + arglist_t args[3] = { + { + "file", &polyfileopt, "File containing vertices of polygon", + nullptr, ARGTYPE_FILE | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr + }, + { + "exclude", &exclopt, "Exclude points inside the polygon", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + void polytest(double lat1, double lon1, + double lat2, double lon2, + double wlat, double wlon, + unsigned short* state, int first, int last); + +}; +#endif // FILTERS_ENABLED +#endif // POLYGON_H_INCLUDED_ diff --git a/position.cc b/position.cc index 82fd98cb7..778a503a1 100644 --- a/position.cc +++ b/position.cc @@ -22,48 +22,13 @@ #include "defs.h" #include "filterdefs.h" #include "grtcirc.h" +#include "position.h" #include #include #if FILTERS_ENABLED -#ifndef M_PI -# define M_PI 3.14159265358979323846 -#endif - -static route_head* cur_rte = nullptr; - -static double pos_dist; -static double max_diff_time; -static char* distopt = nullptr; -static char* timeopt = nullptr; -static char* purge_duplicates = nullptr; -static int check_time; - -typedef struct { - double distance; -} extra_data; - -static -arglist_t position_args[] = { - { - "distance", &distopt, "Maximum positional distance", - nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr - }, - { - "all", &purge_duplicates, - "Suppress all points close to other points", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "time", &timeopt, "Maximum time in seconds beetween two points", - nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -static double -gc_distance(double lat1, double lon1, double lat2, double lon2) +double PositionFilter::gc_distance(double lat1, double lon1, double lat2, double lon2) { return gcdist( RAD(lat1), @@ -74,8 +39,7 @@ gc_distance(double lat1, double lon1, double lat2, double lon2) } /* tear through a waypoint queue, processing points by distance */ -static void -position_runqueue(queue* q, int nelems, int qtype) +void PositionFilter::position_runqueue(queue* q, int nelems, int qtype) { queue* elem, * tmp; Waypoint** comp; @@ -165,8 +129,7 @@ position_runqueue(queue* q, int nelems, int qtype) } } -static void -position_process_any_route(const route_head* rh, int type) +void PositionFilter::position_process_any_route(const route_head* rh, int type) { int i = rh->rte_waypt_ct; @@ -178,42 +141,32 @@ position_process_any_route(const route_head* rh, int type) } -static void -position_process_rte(const route_head* rh) +void PositionFilter::position_process_rte(const route_head* rh) { position_process_any_route(rh, rtedata); } -static void -position_process_trk(const route_head* rh) +void PositionFilter::position_process_trk(const route_head* rh) { position_process_any_route(rh, trkdata); } -static void -position_noop_w(const Waypoint*) -{ -} - -static void -position_noop_t(const route_head*) +void PositionFilter::process() { -} + RteHdFunctor position_process_rte_f(this, &PositionFilter::position_process_rte); + RteHdFunctor position_process_trk_f(this, &PositionFilter::position_process_trk); -static void position_process() -{ int i = waypt_count(); if (i) { position_runqueue(&waypt_head, i, wptdata); } - route_disp_all(position_process_rte, position_noop_t, position_noop_w); - track_disp_all(position_process_trk, position_noop_t, position_noop_w); + route_disp_all(position_process_rte_f, nullptr, nullptr); + track_disp_all(position_process_trk_f, nullptr, nullptr); } -static void -position_init(const char*) +void PositionFilter::init() { char* fm; @@ -236,17 +189,4 @@ position_init(const char*) } } -static void -position_deinit() -{ -} - -filter_vecs_t position_vecs = { - position_init, - position_process, - position_deinit, - nullptr, - position_args -}; - #endif // FILTERS_ENABLED diff --git a/position.h b/position.h new file mode 100644 index 000000000..e7477aa83 --- /dev/null +++ b/position.h @@ -0,0 +1,80 @@ +/* + Distance Between Points Filter(s) + + Copyright (C) 2002 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef POSITION_H_INCLUDED_ +#define POSITION_H_INCLUDED_ + +#include "defs.h" // for route_head (ptr only), ARG_NOMINMAX, ARGTYPE_FLOAT +#include "filter.h" // for Filter +#include "queue.h" // for queue + +#if FILTERS_ENABLED + +class PositionFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + +private: + route_head* cur_rte = nullptr; + + double pos_dist; + double max_diff_time; + char* distopt = nullptr; + char* timeopt = nullptr; + char* purge_duplicates = nullptr; + int check_time; + + typedef struct { + double distance; + } extra_data; + + arglist_t args[4] = { + { + "distance", &distopt, "Maximum positional distance", + nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr + }, + { + "all", &purge_duplicates, + "Suppress all points close to other points", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "time", &timeopt, "Maximum time in seconds beetween two points", + nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + double gc_distance(double lat1, double lon1, double lat2, double lon2); + void position_runqueue(queue* q, int nelems, int qtype); + void position_process_any_route(const route_head* rh, int type); + void position_process_rte(const route_head* rh); + void position_process_trk(const route_head* rh); + +}; +#endif // FILTERS_ENABLED +#endif // POSITION_H_INCLUDED_ diff --git a/queue.cc b/queue.cc index 8f13029c2..fdab0bb42 100644 --- a/queue.cc +++ b/queue.cc @@ -43,180 +43,3 @@ dequeue(queue* element) QUEUE_INIT(element); return element; } - -/* - * The following sorting code was derived from linked-list mergesort - * sample code by Simon Tatham, code obtained from: - * http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html - * Modified for use with gpsbabel's queues by Paul Fox, October 2006. - * - * Original description and copyright messages follow... - */ - -/* - * Demonstration code for sorting a linked list. - * - * The algorithm used is Mergesort, because that works really well - * on linked lists, without requiring the O(N) extra space it needs - * when you do it on arrays. - * - * ... - */ - -/* - * This file is copyright 2001 Simon Tatham. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -void -sortqueue(queue* qh, int (*cmp)(const queue*, const queue*)) -{ - - queue* p, *q, *e, *tail, *oldhead, *list; - int insize, nmerges, psize, qsize, i; - - /* - * Special case: if `list' is empty, we're done. - */ - if (QUEUE_EMPTY(qh)) { - return; - } - - /* - * The algorithm doesn't really want the extra list head - * element. So remove the list head for now. Put it back later. - */ - - list = QUEUE_FIRST(qh); - dequeue(qh); - - insize = 1; - - while (true) { - p = list; - oldhead = list; /* only used for circular linkage */ - list = nullptr; - tail = nullptr; - - nmerges = 0; /* count number of merges we do in this pass */ - - while (p) { - nmerges++; /* there exists a merge to be done */ - /* step `insize' places along from p */ - q = p; - psize = 0; - for (i = 0; i < insize; i++) { - psize++; - q = (q->next == oldhead ? nullptr : q->next); - if (!q) { - break; - } - } - - /* if q hasn't fallen off end, we have - * two lists to merge */ - qsize = insize; - - /* now we have two lists; merge them */ - while (psize > 0 || (qsize > 0 && q)) { - - /* decide whether next element of - * merge comes from p or q - */ - if (psize == 0) { - /* p is empty; e must come from q. */ - e = q; - q = q->next; - qsize--; - if (q == oldhead) { - q = nullptr; - } - } else if (qsize == 0 || !q) { - /* q is empty; e must come from p. */ - e = p; - p = p->next; - psize--; - if (p == oldhead) { - p = nullptr; - } - } else if (cmp(p,q) <= 0) { - /* First element of p is - * lower (or same); e must - * come from p. - */ - e = p; - p = p->next; - psize--; - if (p == oldhead) { - p = nullptr; - } - } else { - /* First element of q is - * lower; e must come from - * q. - */ - e = q; - q = q->next; - qsize--; - if (q == oldhead) { - q = nullptr; - } - } - - /* add the next element to the merged list */ - if (tail) { - tail->next = e; - } else { - list = e; - } - - /* Maintain reverse pointers in a - * doubly linked list. */ - e->prev = tail; - - tail = e; - } - - /* now p has stepped `insize' places - * along, and q has too */ - p = q; - } - tail->next = list; - list->prev = tail; - - /* If we have done only one merge, we're finished. - * Allow for nmerges==0, the empty list case. - */ - if (nmerges <= 1) { - - /* Put the list head back at the start of the list */ - ENQUEUE_TAIL(list, qh); - return; - - } - - /* Otherwise repeat, merging lists twice the size */ - insize *= 2; - } -} diff --git a/queue.h b/queue.h index 863d046a1..1d0aaad96 100644 --- a/queue.h +++ b/queue.h @@ -29,7 +29,7 @@ typedef struct queue { void enqueue(queue* new_el, queue* old); queue* dequeue(queue* element); -void sortqueue(queue* qh, int (*cmp)(const queue*, const queue*)); +//void sortqueue(queue* qh, int (*cmp)(const queue*, const queue*)); /* template */ #define QUEUE_INIT(head) (head)->next = ((head)->prev = head) #define QUEUE_FIRST(head) ((head)->next) @@ -60,4 +60,182 @@ void sortqueue(queue* qh, int (*cmp)(const queue*, const queue*)); (tmp) = QUEUE_NEXT(element), \ (element) != (listhead); \ (element) = (tmp)) + +/* + * The following sorting code was derived from linked-list mergesort + * sample code by Simon Tatham, code obtained from: + * http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html + * Modified for use with gpsbabel's queues by Paul Fox, October 2006. + * + * Original description and copyright messages follow... + */ + +/* + * Demonstration code for sorting a linked list. + * + * The algorithm used is Mergesort, because that works really well + * on linked lists, without requiring the O(N) extra space it needs + * when you do it on arrays. + * + * ... + */ + +/* + * This file is copyright 2001 Simon Tatham. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +template +void +sortqueue(queue* qh, T cmp) +{ + + queue* p, *q, *e, *tail, *oldhead, *list; + int insize, nmerges, psize, qsize, i; + + /* + * Special case: if `list' is empty, we're done. + */ + if (QUEUE_EMPTY(qh)) { + return; + } + + /* + * The algorithm doesn't really want the extra list head + * element. So remove the list head for now. Put it back later. + */ + + list = QUEUE_FIRST(qh); + dequeue(qh); + + insize = 1; + + while (true) { + p = list; + oldhead = list; /* only used for circular linkage */ + list = nullptr; + tail = nullptr; + + nmerges = 0; /* count number of merges we do in this pass */ + + while (p) { + nmerges++; /* there exists a merge to be done */ + /* step `insize' places along from p */ + q = p; + psize = 0; + for (i = 0; i < insize; i++) { + psize++; + q = (q->next == oldhead ? nullptr : q->next); + if (!q) { + break; + } + } + + /* if q hasn't fallen off end, we have + * two lists to merge */ + qsize = insize; + + /* now we have two lists; merge them */ + while (psize > 0 || (qsize > 0 && q)) { + + /* decide whether next element of + * merge comes from p or q + */ + if (psize == 0) { + /* p is empty; e must come from q. */ + e = q; + q = q->next; + qsize--; + if (q == oldhead) { + q = nullptr; + } + } else if (qsize == 0 || !q) { + /* q is empty; e must come from p. */ + e = p; + p = p->next; + psize--; + if (p == oldhead) { + p = nullptr; + } + } else if (cmp(p,q) <= 0) { + /* First element of p is + * lower (or same); e must + * come from p. + */ + e = p; + p = p->next; + psize--; + if (p == oldhead) { + p = nullptr; + } + } else { + /* First element of q is + * lower; e must come from + * q. + */ + e = q; + q = q->next; + qsize--; + if (q == oldhead) { + q = nullptr; + } + } + + /* add the next element to the merged list */ + if (tail) { + tail->next = e; + } else { + list = e; + } + + /* Maintain reverse pointers in a + * doubly linked list. */ + e->prev = tail; + + tail = e; + } + + /* now p has stepped `insize' places + * along, and q has too */ + p = q; + } + tail->next = list; + list->prev = tail; + + /* If we have done only one merge, we're finished. + * Allow for nmerges==0, the empty list case. + */ + if (nmerges <= 1) { + + /* Put the list head back at the start of the list */ + ENQUEUE_TAIL(list, qh); + return; + + } + + /* Otherwise repeat, merging lists twice the size */ + insize *= 2; + } +} #endif // QUEUE_H_INCLUDED_ diff --git a/radius.cc b/radius.cc index 3d29df98e..ceafde756 100644 --- a/radius.cc +++ b/radius.cc @@ -21,66 +21,13 @@ #include "defs.h" #include "filterdefs.h" #include "grtcirc.h" +#include "radius.h" #include #include #if FILTERS_ENABLED -#ifndef M_PI -# define M_PI 3.14159265358979323846 -#endif - -static double pos_dist; -static char* distopt = nullptr; -static char* latopt = nullptr; -static char* lonopt = nullptr; -static char* exclopt = nullptr; -static char* nosort = nullptr; -static char* maxctarg = nullptr; -static char* routename = nullptr; -static int maxct; - -static Waypoint* home_pos; - -typedef struct { - double distance; -} extra_data; - -static -arglist_t radius_args[] = { - { - "lat", &latopt, "Latitude for center point (D.DDDDD)", - nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr - }, - { - "lon", &lonopt, "Longitude for center point (D.DDDDD)", - nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr - }, - { - "distance", &distopt, "Maximum distance from center", - nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr - }, - { - "exclude", &exclopt, "Exclude points close to center", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "nosort", &nosort, "Inhibit sort by distance to center", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "maxcount", &maxctarg,"Output no more than this number of points", - nullptr, ARGTYPE_INT, "1", nullptr, nullptr - }, - { - "asroute", &routename,"Put resulting waypoints in route of this name", - nullptr, ARGTYPE_STRING, nullptr, nullptr, nullptr - }, - ARG_TERMINATOR -}; - -static double -gc_distance(double lat1, double lon1, double lat2, double lon2) +double RadiusFilter::gc_distance(double lat1, double lon1, double lat2, double lon2) { return gcdist( RAD(lat1), @@ -90,8 +37,7 @@ gc_distance(double lat1, double lon1, double lat2, double lon2) ); } -static int -dist_comp(const void* a, const void* b) +int RadiusFilter::dist_comp(const void* a, const void* b) { const Waypoint* x1 = *(Waypoint**)a; const Waypoint* x2 = *(Waypoint**)b; @@ -108,8 +54,7 @@ dist_comp(const void* a, const void* b) } -static void -radius_process() +void RadiusFilter::process() { #if !NEWQ queue* elem, * tmp; @@ -120,7 +65,7 @@ radius_process() queue temp_head; route_head* rte_head = nullptr; #if NEWQ - foreach(Waypoint* waypointp, waypt_list) { + foreach (Waypoint* waypointp, waypt_list) { #else QUEUE_FOR_EACH(&waypt_head, elem, tmp) { Waypoint* waypointp = (Waypoint*)elem; @@ -158,7 +103,7 @@ radius_process() */ #if NEWQ - foreach(Waypoint* wp, waypt_list) { + foreach (Waypoint* wp, waypt_list) { #else QUEUE_FOR_EACH(&waypt_head, elem, tmp) { Waypoint* wp = (Waypoint*) elem; @@ -202,8 +147,7 @@ radius_process() xfree(comp); } -static void -radius_init(const char*) +void RadiusFilter::init() { char* fm; @@ -234,19 +178,11 @@ radius_init(const char*) } } -static void -radius_deinit() +void RadiusFilter::deinit() { if (home_pos) { xfree(home_pos); } } -filter_vecs_t radius_vecs = { - radius_init, - radius_process, - radius_deinit, - nullptr, - radius_args -}; #endif // FILTERS_ENABLED diff --git a/radius.h b/radius.h new file mode 100644 index 000000000..f96e9ec3a --- /dev/null +++ b/radius.h @@ -0,0 +1,95 @@ +/* + Radius Filter + + Copyright (C) 2002 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef RADIUS_H_INCLUDED_ +#define RADIUS_H_INCLUDED_ + +#include "defs.h" // for ARG_NOMINMAX, ARGTYPE_FLOAT, ARGTYPE_REQUIRED +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class RadiusFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + void deinit() override; + +private: + double pos_dist; + char* distopt = nullptr; + char* latopt = nullptr; + char* lonopt = nullptr; + char* exclopt = nullptr; + char* nosort = nullptr; + char* maxctarg = nullptr; + char* routename = nullptr; + int maxct; + + Waypoint* home_pos; + + typedef struct { + double distance; + } extra_data; + + arglist_t args[8] = { + { + "lat", &latopt, "Latitude for center point (D.DDDDD)", + nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr + }, + { + "lon", &lonopt, "Longitude for center point (D.DDDDD)", + nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr + }, + { + "distance", &distopt, "Maximum distance from center", + nullptr, ARGTYPE_FLOAT | ARGTYPE_REQUIRED, ARG_NOMINMAX, nullptr + }, + { + "exclude", &exclopt, "Exclude points close to center", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "nosort", &nosort, "Inhibit sort by distance to center", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "maxcount", &maxctarg,"Output no more than this number of points", + nullptr, ARGTYPE_INT, "1", nullptr, nullptr + }, + { + "asroute", &routename,"Put resulting waypoints in route of this name", + nullptr, ARGTYPE_STRING, nullptr, nullptr, nullptr + }, + ARG_TERMINATOR + }; + + double gc_distance(double lat1, double lon1, double lat2, double lon2); + static int dist_comp(const void* a, const void* b); + +}; +#endif // FILTERS_ENABLED +#endif // RADIUS_H_INCLUDED_ diff --git a/reference/swapdata.gpx b/reference/swapdata.gpx new file mode 100644 index 000000000..15bf56d49 --- /dev/null +++ b/reference/swapdata.gpx @@ -0,0 +1,31 @@ + + + + + + + + WPT001 + WPT001 + WPT001 + + + WPT002 + WPT002 + WPT002 + + + + RPT001 + + + RPT002 + + + + + + + + + diff --git a/reference/swapdata~gpx.gpx b/reference/swapdata~gpx.gpx new file mode 100644 index 000000000..43b7e923d --- /dev/null +++ b/reference/swapdata~gpx.gpx @@ -0,0 +1,31 @@ + + + + + + + + WPT001 + WPT001 + WPT001 + + + WPT002 + WPT002 + WPT002 + + + + RPT001 + + + RPT002 + + + + + + + + + diff --git a/reverse_route.cc b/reverse_route.cc index a564b3669..b8202be47 100644 --- a/reverse_route.cc +++ b/reverse_route.cc @@ -20,22 +20,16 @@ */ #include "defs.h" #include "filterdefs.h" +#include "reverse_route.h" #if FILTERS_ENABLED #define MYNAME "Route reversal filter" -static int prev_new_trkseg; - -static -arglist_t reverse_route_args[] = { - ARG_TERMINATOR -}; - /* * reverse_route_wpt fixes up the waypoint flag new_trkseg */ -static void reverse_route_wpt(const Waypoint* waypointp) +void ReverseRouteFilter::reverse_route_wpt(const Waypoint* waypointp) { /* Cast away const-ness */ @@ -48,22 +42,22 @@ static void reverse_route_wpt(const Waypoint* waypointp) prev_new_trkseg = curr_new_trkseg; } -static void -reverse_route_head(const route_head* rte) +void ReverseRouteFilter::reverse_route_head(const route_head* rte) { route_reverse(rte); prev_new_trkseg = 1; } -static void -reverse_route_process() +void ReverseRouteFilter::process() { - track_disp_all(reverse_route_head, nullptr, reverse_route_wpt); - route_disp_all(reverse_route_head, nullptr, nullptr); + WayptFunctor reverse_route_wpt_f(this, &ReverseRouteFilter::reverse_route_wpt); + RteHdFunctor reverse_route_head_f(this, &ReverseRouteFilter::reverse_route_head); + + track_disp_all(reverse_route_head_f, nullptr, reverse_route_wpt_f); + route_disp_all(reverse_route_head_f, nullptr, nullptr); } -static void -reverse_route_init(const char*) +void ReverseRouteFilter::init() { switch (global_opts.objective) { case rtedata: @@ -76,17 +70,4 @@ reverse_route_init(const char*) } } -static void -reverse_route_deinit() -{ - /* do nothing */ -} - -filter_vecs_t reverse_route_vecs = { - reverse_route_init, - reverse_route_process, - reverse_route_deinit, - nullptr, - reverse_route_args -}; #endif diff --git a/reverse_route.h b/reverse_route.h new file mode 100644 index 000000000..257edd2ea --- /dev/null +++ b/reverse_route.h @@ -0,0 +1,46 @@ +/* + Route reversal filter. + + Copyright (C) 2003 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ +#include "defs.h" // for Waypoint (ptr only), arglist_t, route_head (ptr ... +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class ReverseRouteFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + +private: + int prev_new_trkseg; + arglist_t args[1] = { + ARG_TERMINATOR + }; + + void reverse_route_wpt(const Waypoint* waypointp); + void reverse_route_head(const route_head* rte); + +}; +#endif diff --git a/route.cc b/route.cc index 0ed14418b..631c218d1 100644 --- a/route.cc +++ b/route.cc @@ -22,8 +22,8 @@ #include "session.h" #include -static queue my_route_head; -static queue my_track_head; +queue my_route_head; +queue my_track_head; static int rte_head_ct; static int rte_waypts; static int trk_head_ct; @@ -254,18 +254,9 @@ track_del_wpt(route_head* rte, Waypoint* wpt) } void -route_disp(const route_head* rh, waypt_cb cb) +route_disp(const route_head* rh, std::nullptr_t /* wc */) { - queue* elem, *tmp; - if (!cb) { - return; - } - QUEUE_FOR_EACH(&rh->waypoint_list, elem, tmp) { - Waypoint* waypointp; - waypointp = (Waypoint*) elem; - (*cb)(waypointp); - } - +// wc == nullptr } void @@ -279,23 +270,6 @@ route_reverse(const route_head* rte_hd) } } -static void -common_disp_all(queue* qh, route_hdr rh, route_trl rt, waypt_cb wc) -{ - queue* elem, *tmp; - QUEUE_FOR_EACH(qh, elem, tmp) { - const route_head* rhp; - rhp = (route_head*) elem; - if (rh) { - (*rh)(rhp); - } - route_disp(rhp, wc); - if (rt) { - (*rt)(rhp); - } - } -} - static void common_disp_session(const session_t* se, queue* qh, route_hdr rh, route_trl rt, waypt_cb wc) { @@ -315,24 +289,12 @@ common_disp_session(const session_t* se, queue* qh, route_hdr rh, route_trl rt, } } -void -route_disp_all(route_hdr rh, route_trl rt, waypt_cb wc) -{ - common_disp_all(&my_route_head, rh, rt, wc); -} - void route_disp_session(const session_t* se, route_hdr rh, route_trl rt, waypt_cb wc) { common_disp_session(se, &my_route_head, rh, rt, wc); } -void -track_disp_all(route_hdr rh, route_trl rt, waypt_cb wc) -{ - common_disp_all(&my_track_head, rh, rt, wc); -} - void track_disp_session(const session_t* se, route_hdr rh, route_trl rt, waypt_cb wc) { diff --git a/smplrout.cc b/smplrout.cc index eb7983667..61fe33243 100644 --- a/smplrout.cc +++ b/smplrout.cc @@ -59,78 +59,22 @@ #include "defs.h" #include "filterdefs.h" #include "grtcirc.h" +#include "smplrout.h" #include +#if FILTERS_ENABLED #define MYNAME "simplify" #define sqr(a) ((a)*(a)) -static int count = 0; -static double totalerror = 0; -static double error = 0; - -static char* countopt; -static char* erroropt; -static char* xteopt; -static char* lenopt; -static char* relopt; -static void (*waypt_del_fnp)(route_head* rte, Waypoint* wpt); - -static -arglist_t routesimple_args[] = { - { - "count", &countopt, "Maximum number of points in route", - nullptr, ARGTYPE_INT | ARGTYPE_BEGIN_REQ | ARGTYPE_BEGIN_EXCL, "1", nullptr, nullptr - }, - { - "error", &erroropt, "Maximum error", nullptr, - ARGTYPE_STRING | ARGTYPE_END_REQ | ARGTYPE_END_EXCL, "0", nullptr, nullptr - }, - { - "crosstrack", &xteopt, "Use cross-track error (default)", nullptr, - ARGTYPE_BOOL | ARGTYPE_BEGIN_EXCL, ARG_NOMINMAX, nullptr - }, - { - "length", &lenopt, "Use arclength error", nullptr, - ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "relative", &relopt, "Use relative error", nullptr, - ARGTYPE_BOOL | ARGTYPE_END_EXCL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -struct xte_intermed; - -struct xte { - double distance; - int ordinal; - struct xte_intermed* intermed; -}; - -struct xte_intermed { - struct xte* xte_rec; - struct xte_intermed* next; - struct xte_intermed* prev; - const Waypoint* wpt; -}; - -static void -free_xte(struct xte* xte_rec) +void SimplifyRouteFilter::free_xte(struct xte* xte_rec) { xfree(xte_rec->intermed); } #define HUGEVAL 2000000000 -static struct xte_intermed* tmpprev = nullptr; -static int xte_count = 0; -static const route_head* cur_rte = nullptr; -static struct xte* xte_recs = nullptr; - -static void -routesimple_waypt_pr(const Waypoint* wpt) +void SimplifyRouteFilter::routesimple_waypt_pr(const Waypoint* wpt) { if (!cur_rte) { return; @@ -148,8 +92,7 @@ routesimple_waypt_pr(const Waypoint* wpt) xte_count++; } -static void -compute_xte(struct xte* xte_rec) +void SimplifyRouteFilter::compute_xte(struct xte* xte_rec) { const Waypoint* wpt3 = xte_rec->intermed->wpt; const Waypoint* wpt1 = nullptr; @@ -209,9 +152,7 @@ compute_xte(struct xte* xte_rec) } } - -static int -compare_xte(const void* a, const void* b) +int SimplifyRouteFilter::compare_xte(const void* a, const void* b) { double distdiff = ((struct xte*)a)->distance - ((struct xte*)b)->distance; @@ -241,8 +182,7 @@ compare_xte(const void* a, const void* b) return 0; } -static void -routesimple_head(const route_head* rte) +void SimplifyRouteFilter::routesimple_head(const route_head* rte) { cur_rte = nullptr; /* build array of XTE/wpt xref records */ @@ -265,8 +205,7 @@ routesimple_head(const route_head* rte) } -static void -shuffle_xte(struct xte* xte_rec) +void SimplifyRouteFilter::shuffle_xte(struct xte* xte_rec) { struct xte tmp_xte; while (xte_rec > xte_recs && compare_xte(xte_rec, xte_rec-1) < 0) { @@ -300,8 +239,7 @@ shuffle_xte(struct xte* xte_rec) } } -static void -routesimple_tail(const route_head* rte) +void SimplifyRouteFilter::routesimple_tail(const route_head* rte) { int i; if (!cur_rte) { @@ -321,9 +259,9 @@ routesimple_tail(const route_head* rte) xte_recs[i].intermed->xte_rec = xte_recs+i; } // Ensure totalerror starts with the distance between first and second points - // and not the zero-init. From a June 25, 2014 thread titled "Simplify + // and not the zero-init. From a June 25, 2014 thread titled "Simplify // Filter: GPSBabel removes one trackpoint..." I never could repro it it - // with the sample data, so there is no automated test case, but Steve's + // with the sample data, so there is no automated test case, but Steve's // fix is "obviously" right here. if (xte_count >= 1) { totalerror = xte_recs[xte_count-1].distance; @@ -372,18 +310,20 @@ routesimple_tail(const route_head* rte) xfree(xte_recs); } -static void -routesimple_process() +void SimplifyRouteFilter::process() { + WayptFunctor routesimple_waypt_pr_f(this, &SimplifyRouteFilter::routesimple_waypt_pr); + RteHdFunctor routesimple_head_f(this, &SimplifyRouteFilter::routesimple_head); + RteHdFunctor routesimple_tail_f(this, &SimplifyRouteFilter::routesimple_tail); + waypt_del_fnp = route_del_wpt; - route_disp_all(routesimple_head, routesimple_tail, routesimple_waypt_pr); + route_disp_all(routesimple_head_f, routesimple_tail_f, routesimple_waypt_pr_f); waypt_del_fnp = track_del_wpt; - track_disp_all(routesimple_head, routesimple_tail, routesimple_waypt_pr); + track_disp_all(routesimple_head_f, routesimple_tail_f, routesimple_waypt_pr_f); } -static void -routesimple_init(const char*) +void SimplifyRouteFilter::init() { count = 0; @@ -410,16 +350,4 @@ routesimple_init(const char*) } } -static void -routesimple_deinit() -{ - /* do nothing */ -} - -filter_vecs_t routesimple_vecs = { - routesimple_init, - routesimple_process, - routesimple_deinit, - nullptr, - routesimple_args -}; +#endif // FILTERS_ENABLED diff --git a/smplrout.h b/smplrout.h new file mode 100644 index 000000000..95eccebb4 --- /dev/null +++ b/smplrout.h @@ -0,0 +1,146 @@ +/* + Route / track simplification filter + + Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +/* The following comments are from an email I wrote to Paul Fox in November + * 2005 in an attempt to explain how the cross track error minimization method + * works (RLP 2005): + * + * It's pretty simple, really: for each triplet of vertices A-B-C, we compute + * how much cross-track error we'd introduce by going straight from A to C + * (the maximum cross-track error for that segment is the height of the + * triangle ABC, measured between vertex B and edge AC.) If we need to remove + * 40 points, we just sort the points by that metric and remove the 40 + * smallest ones. + * + * It's actually a little more complicated than that, because removing a + * point changes the result for its two nearest neighbors. When we remove + * one, we recompute the neighbors and then sort them back into the list + * at their new locations. + * + * As you can see, this hasn't been shown to be an optimal algorithm. After + * all, removing one high-xte point might create two very low-xte neighbors + * that more than make up for the high xte of the original point. I believe + * the optimal algorithm would be NP-complete, but I haven't proven it. This + * is really more of a heuristic than anything, but it seems to work well for + * the routes I've fed it. + * + * Not in that email was an explanation of how the pathlength-based calculation + * works: instead of computing the height of the triangle, we just compute + * the difference in pathlength from taking the direct route. This case, + * too, is only a heuristic, as it's possible that a different combination or + * order of point removals could lead to a smaller number of points with less + * reduction in path length. In the case of pathlength, error is cumulative. +*/ + +/* + History: + + 2008/08/20: added "relative" option, (Carsten Allefeld, carsten.allefeld@googlemail.com) +*/ + +#ifndef SMPLROUT_H_INCLUDED_ +#define SMPLROUT_H_INCLUDED_ + +#include "defs.h" // for route_head (ptr only), Waypoint (ptr only), ARGT... +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class SimplifyRouteFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + +private: + + int count = 0; + double totalerror = 0; + double error = 0; + + char* countopt; + char* erroropt; + char* xteopt; + char* lenopt; + char* relopt; + void (*waypt_del_fnp)(route_head* rte, Waypoint* wpt); + + arglist_t args[6] = { + { + "count", &countopt, "Maximum number of points in route", + nullptr, ARGTYPE_INT | ARGTYPE_BEGIN_REQ | ARGTYPE_BEGIN_EXCL, "1", nullptr, nullptr + }, + { + "error", &erroropt, "Maximum error", nullptr, + ARGTYPE_STRING | ARGTYPE_END_REQ | ARGTYPE_END_EXCL, "0", nullptr, nullptr + }, + { + "crosstrack", &xteopt, "Use cross-track error (default)", nullptr, + ARGTYPE_BOOL | ARGTYPE_BEGIN_EXCL, ARG_NOMINMAX, nullptr + }, + { + "length", &lenopt, "Use arclength error", nullptr, + ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "relative", &relopt, "Use relative error", nullptr, + ARGTYPE_BOOL | ARGTYPE_END_EXCL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + struct xte_intermed; + + struct xte { + double distance; + int ordinal; + struct xte_intermed* intermed; + }; + + struct xte_intermed { + struct xte* xte_rec; + struct xte_intermed* next; + struct xte_intermed* prev; + const Waypoint* wpt; + }; + + void free_xte(struct xte* xte_rec); + + struct xte_intermed* tmpprev = nullptr; + int xte_count = 0; + const route_head* cur_rte = nullptr; + struct xte* xte_recs = nullptr; + + void routesimple_waypt_pr(const Waypoint* wpt); + void compute_xte(struct xte* xte_rec); + static int compare_xte(const void* a, const void* b); + void routesimple_head(const route_head* rte); + void shuffle_xte(struct xte* xte_rec); + void routesimple_tail(const route_head* rte); + +}; + +#endif // FILTERS_ENABLED +#endif // SMPLROUT_H_INCLUDED_ diff --git a/sort.cc b/sort.cc index b4ff6b00c..9c1d63449 100644 --- a/sort.cc +++ b/sort.cc @@ -20,45 +20,12 @@ */ #include "defs.h" #include "filterdefs.h" +#include "sort.h" #include #if FILTERS_ENABLED -typedef enum { - sm_unknown = 0, - sm_gcid, - sm_shortname, - sm_description, - sm_time -} sort_mode_; - -static sort_mode_ sort_mode = sm_shortname; /* How are we sorting these? */ - -static char* opt_sm_gcid, *opt_sm_shortname, *opt_sm_description, *opt_sm_time; - -static -arglist_t sort_args[] = { - { - "gcid", &opt_sm_gcid, "Sort by numeric geocache ID", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "shortname", &opt_sm_shortname, "Sort by waypoint short name", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "description", &opt_sm_description, "Sort by waypoint description", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "time", &opt_sm_time, "Sort by time", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -static int -sort_comp(const queue* a, const queue* b) +int SortFilter::sort_comp(const queue* a, const queue* b) { const Waypoint* x1 = (Waypoint*)a; const Waypoint* x2 = (Waypoint*)b; @@ -78,14 +45,19 @@ sort_comp(const queue* a, const queue* b) } } -static void -sort_process() +int SortFilter::SortCompFunctor::operator()(const queue* a, const queue* b) { + return that->sort_comp(a, b); +} + +void SortFilter::process() +{ + SortCompFunctor sort_comp(*this); + sortqueue(&waypt_head, sort_comp); } -static void -sort_init(const char*) +void SortFilter::init() { if (opt_sm_gcid) { sort_mode = sm_gcid; @@ -101,11 +73,4 @@ sort_init(const char*) } } -filter_vecs_t sort_vecs = { - sort_init, - sort_process, - nullptr, - nullptr, - sort_args -}; #endif // FILTERS_ENABLED diff --git a/sort.h b/sort.h new file mode 100644 index 000000000..4dd852aa5 --- /dev/null +++ b/sort.h @@ -0,0 +1,88 @@ +/* + Arbitrary Sorting Filter(s) + + Copyright (C) 2004 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef SORT_H_INCLUDED_ +#define SORT_H_INCLUDED_ + +#include "defs.h" // for ARGTYPE_BOOL, ARG_NOMINMAX, arglist_t, ARG_TERMI... +#include "filter.h" // for Filter +#include "queue.h" // for queue + +#if FILTERS_ENABLED + +class SortFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + +private: + typedef enum { + sm_unknown = 0, + sm_gcid, + sm_shortname, + sm_description, + sm_time + } sort_mode_; + + sort_mode_ sort_mode = sm_shortname; /* How are we sorting these? */ + + char* opt_sm_gcid, *opt_sm_shortname, *opt_sm_description, *opt_sm_time; + + arglist_t args[5] = { + { + "gcid", &opt_sm_gcid, "Sort by numeric geocache ID", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "shortname", &opt_sm_shortname, "Sort by waypoint short name", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "description", &opt_sm_description, "Sort by waypoint description", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "time", &opt_sm_time, "Sort by time", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + int sort_comp(const queue* a, const queue* b); + + class SortCompFunctor + { + public: + SortCompFunctor(SortFilter& obj) : that(&obj) {} + int operator()(const queue* a, const queue* b); + + private: + SortFilter* that; + }; + +}; +#endif // FILTERS_ENABLED +#endif // SORT_H_INCLUDED_ diff --git a/src/core/datetime.h b/src/core/datetime.h index 15065f1d1..518346b9f 100644 --- a/src/core/datetime.h +++ b/src/core/datetime.h @@ -20,6 +20,8 @@ */ +#ifndef DATETIME_H_INCLUDED_ +#define DATETIME_H_INCLUDED_ #include @@ -89,3 +91,5 @@ public: }; } // namespace gpsbabel + +#endif // DATETIME_H_INCLUDED_ diff --git a/stackfilter.cc b/stackfilter.cc index a774df786..ada7c7307 100644 --- a/stackfilter.cc +++ b/stackfilter.cc @@ -21,78 +21,14 @@ #include "defs.h" #include "filterdefs.h" +#include "stackfilter.h" #include #if FILTERS_ENABLED #define MYNAME "Stack filter" -static char* opt_push = nullptr; -static char* opt_copy = nullptr; -static char* opt_pop = nullptr; -static char* opt_append = nullptr; -static char* opt_discard = nullptr; -static char* opt_replace = nullptr; -static char* opt_swap = nullptr; -static char* opt_depth = nullptr; -static char* nowarn = nullptr; -static int warnings_enabled = 1; -static int swapdepth = 0; - -static -arglist_t stackfilt_args[] = { - { - "push", &opt_push, "Push waypoint list onto stack", nullptr, - ARGTYPE_BEGIN_EXCL | ARGTYPE_BEGIN_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "pop", &opt_pop, "Pop waypoint list from stack", nullptr, - ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "swap", &opt_swap, "Swap waypoint list with item on stack", - nullptr, ARGTYPE_END_EXCL | ARGTYPE_END_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "copy", &opt_copy, "(push) Copy waypoint list", nullptr, - ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "append", &opt_append, "(pop) Append list", nullptr, - ARGTYPE_BEGIN_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "discard", &opt_discard, "(pop) Discard top of stack", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "replace", &opt_replace, "(pop) Replace list (default)", - nullptr, ARGTYPE_END_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "depth", &opt_depth, "(swap) Item to use (default=1)", - nullptr, ARGTYPE_INT, "0", nullptr, nullptr - }, - { - "nowarn", &nowarn, "Suppress cleanup warning", nullptr, - ARGTYPE_BOOL | ARGTYPE_HIDDEN, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -static struct stack_elt { - queue waypts; - queue routes; - queue tracks; - unsigned int waypt_ct; - int route_count; - int track_count; - struct stack_elt* next; -}* stack = nullptr; - - -static void -stackfilt_process() +void StackFilter::process() { struct stack_elt* tmp_elt = nullptr; queue* elem = nullptr; @@ -191,8 +127,7 @@ stackfilt_process() } } -static void -stackfilt_init(const char*) +void StackFilter::init() { int invalid = 0; @@ -231,14 +166,12 @@ stackfilt_init(const char*) } -static void -stackfilt_deinit() +void StackFilter::deinit() { swapdepth = 0; } -static void -stackfilt_exit() +void StackFilter::exit() { struct stack_elt* tmp_elt = nullptr; @@ -254,12 +187,4 @@ stackfilt_exit() } } -filter_vecs_t stackfilt_vecs = { - stackfilt_init, - stackfilt_process, - stackfilt_deinit, - stackfilt_exit, - stackfilt_args -}; - #endif // FILTERS_ENABLED diff --git a/stackfilter.h b/stackfilter.h new file mode 100644 index 000000000..798a52f16 --- /dev/null +++ b/stackfilter.h @@ -0,0 +1,108 @@ +/* + Stack filter + + Copyright (C) 2002 Robert Lipe, robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef STACKFILTER_H_INCLUDED_ +#define STACKFILTER_H_INCLUDED_ + +#include "defs.h" // for ARGTYPE_BOOL, ARG_NOMINMAX, ARGTYPE_BEGIN_EXCL +#include "filter.h" // for Filter +#include "queue.h" // for queue + +#if FILTERS_ENABLED + +class StackFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + void deinit() override; + void exit() override; + +private: + char* opt_push = nullptr; + char* opt_copy = nullptr; + char* opt_pop = nullptr; + char* opt_append = nullptr; + char* opt_discard = nullptr; + char* opt_replace = nullptr; + char* opt_swap = nullptr; + char* opt_depth = nullptr; + char* nowarn = nullptr; + int warnings_enabled = 1; + int swapdepth = 0; + + arglist_t args[10] = { + { + "push", &opt_push, "Push waypoint list onto stack", nullptr, + ARGTYPE_BEGIN_EXCL | ARGTYPE_BEGIN_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "pop", &opt_pop, "Pop waypoint list from stack", nullptr, + ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "swap", &opt_swap, "Swap waypoint list with item on stack", + nullptr, ARGTYPE_END_EXCL | ARGTYPE_END_REQ | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "copy", &opt_copy, "(push) Copy waypoint list", nullptr, + ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "append", &opt_append, "(pop) Append list", nullptr, + ARGTYPE_BEGIN_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "discard", &opt_discard, "(pop) Discard top of stack", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "replace", &opt_replace, "(pop) Replace list (default)", + nullptr, ARGTYPE_END_EXCL | ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "depth", &opt_depth, "(swap) Item to use (default=1)", + nullptr, ARGTYPE_INT, "0", nullptr, nullptr + }, + { + "nowarn", &nowarn, "Suppress cleanup warning", nullptr, + ARGTYPE_BOOL | ARGTYPE_HIDDEN, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + struct stack_elt { + queue waypts; + queue routes; + queue tracks; + unsigned int waypt_ct; + int route_count; + int track_count; + struct stack_elt* next; + }* stack = nullptr; + +}; +#endif // FILTERS_ENABLED +#endif // STACKFILTER_H_INCLUDED_ diff --git a/swapdata.cc b/swapdata.cc index d0ce2d3cb..1204a5017 100644 --- a/swapdata.cc +++ b/swapdata.cc @@ -22,18 +22,13 @@ #include "defs.h" #include "filterdefs.h" +#include "swapdata.h" #define MYNAME "swapdata" #if FILTERS_ENABLED -static -arglist_t swapdata_args[] = { - ARG_TERMINATOR -}; - -static void -swapdata_cb(const Waypoint* ref) +void SwapDataFilter::swapdata_cb(const Waypoint* ref) { Waypoint* wpt = (Waypoint*)ref; double x; @@ -49,23 +44,13 @@ swapdata_cb(const Waypoint* ref) * %%% global callbacks called by gpsbabel main process %%% * *******************************************************************************/ -static void -swapdata_process(void) /* this procedure must be present in vecs */ +void SwapDataFilter::process(void) /* this procedure must be present in vecs */ { - waypt_disp_all(swapdata_cb); - route_disp_all(nullptr, nullptr, swapdata_cb); - track_disp_all(nullptr, nullptr, swapdata_cb); -} + WayptFunctor swapdata_cb_f(this, &SwapDataFilter::swapdata_cb); -/*******************************************************************************/ - -filter_vecs_t swapdata_vecs = { - nullptr, - swapdata_process, - nullptr, - nullptr, - swapdata_args -}; + waypt_disp_all(swapdata_cb_f); + route_disp_all(nullptr, nullptr, swapdata_cb_f); + track_disp_all(nullptr, nullptr, swapdata_cb_f); +} -/*******************************************************************************/ #endif // FILTERS_ENABLED diff --git a/swapdata.h b/swapdata.h new file mode 100644 index 000000000..8e321247f --- /dev/null +++ b/swapdata.h @@ -0,0 +1,50 @@ +/* + + Swap data filter + + Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef SWAPDATA_H_INCLUDED_ +#define SWAPDATA_H_INCLUDED_ + +#include "defs.h" // for Waypoint (ptr only), arglist_t, ARG_TERMINATOR +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class SwapDataFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void process() override; + +private: + arglist_t args[1] = { + ARG_TERMINATOR + }; + + void swapdata_cb(const Waypoint* ref); + +}; + +#endif // FILTERS_ENABLED +#endif // SWAPDATA_H_INCLUDED_ diff --git a/testo.d/swap.test b/testo.d/swap.test new file mode 100644 index 000000000..a7d855dcd --- /dev/null +++ b/testo.d/swap.test @@ -0,0 +1,6 @@ + +# swapdata filter +rm -f ${TMPDIR}/gl.gpx ${TMPDIR}/gpx.wpt +gpsbabel -i gpx -f ${REFERENCE}/swapdata.gpx -x swap -o gpx -F ${TMPDIR}/swapdata~gpx.gpx +compare ${REFERENCE}/swapdata~gpx.gpx ${TMPDIR}/swapdata~gpx.gpx + diff --git a/tools/createGeoidGrid b/tools/createGeoidGrid index 61345af6f..5aa0fbb26 100755 --- a/tools/createGeoidGrid +++ b/tools/createGeoidGrid @@ -1,6 +1,6 @@ #!/bin/bash # -# this is used to generate height.h +# this is used to generate heightgrid.h # which is used by height.c to compute the EMG96 geoid height # relative to the WGS84 ellipsoid. # It requires the GeographicLib utility GeoidEval. diff --git a/trackfilter.cc b/trackfilter.cc index 5035a3e21..df0575bce 100644 --- a/trackfilter.cc +++ b/trackfilter.cc @@ -25,6 +25,7 @@ #include "filterdefs.h" #include "grtcirc.h" #include "strptime.h" +#include "trackfilter.h" #include "xmlgeneric.h" #include #include @@ -35,161 +36,16 @@ #if FILTERS_ENABLED || MINIMAL_FILTERS #define MYNAME "trackfilter" -#define TRACKFILTER_PACK_OPTION "pack" -#define TRACKFILTER_SPLIT_OPTION "split" -#define TRACKFILTER_SDIST_OPTION "sdistance" -#define TRACKFILTER_TITLE_OPTION "title" -#define TRACKFILTER_MERGE_OPTION "merge" -#define TRACKFILTER_NAME_OPTION "name" -#define TRACKFILTER_STOP_OPTION "stop" -#define TRACKFILTER_START_OPTION "start" -#define TRACKFILTER_MOVE_OPTION "move" -#define TRACKFILTER_FIX_OPTION "fix" -#define TRACKFILTER_COURSE_OPTION "course" -#define TRACKFILTER_SPEED_OPTION "speed" -#define TRACKFILTER_SEG2TRK_OPTION "seg2trk" -#define TRACKFILTER_TRK2SEG_OPTION "trk2seg" -#define TRACKFILTER_SEGMENT_OPTION "segment" -#define TRACKFILTER_FAKETIME_OPTION "faketime" -#define TRACKFILTER_DISCARD_OPTION "discard" -#define TRACKFILTER_MINPOINTS_OPTION "minimum_points" - #undef TRACKF_DBG -static char* opt_merge = nullptr; -static char* opt_pack = nullptr; -static char* opt_split = nullptr; -static char* opt_sdistance = nullptr; -static char* opt_move = nullptr; -static char* opt_title = nullptr; -static char* opt_start = nullptr; -static char* opt_stop = nullptr; -static char* opt_fix = nullptr; -static char* opt_course = nullptr; -static char* opt_speed = nullptr; -static char* opt_name = nullptr; -static char* opt_seg2trk = nullptr; -static char* opt_trk2seg = nullptr; -static char* opt_segment = nullptr; -static char* opt_faketime = nullptr; -static char* opt_discard = nullptr; -static char* opt_minpoints = nullptr; - -static -arglist_t trackfilter_args[] = { - { - TRACKFILTER_MOVE_OPTION, &opt_move, - "Correct trackpoint timestamps by a delta", nullptr, ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_PACK_OPTION, &opt_pack, - "Pack all tracks into one", nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_SPLIT_OPTION, &opt_split, - "Split by date or time interval (see README)", nullptr, - ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_SDIST_OPTION, &opt_sdistance, - "Split by distance", nullptr, - ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_MERGE_OPTION, &opt_merge, - "Merge multiple tracks for the same way", nullptr, ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_NAME_OPTION, &opt_name, - "Use only track(s) where title matches given name", nullptr, ARGTYPE_STRING, - ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_START_OPTION, &opt_start, - "Use only track points after this timestamp", nullptr, ARGTYPE_INT, - ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_STOP_OPTION, &opt_stop, - "Use only track points before this timestamp", nullptr, ARGTYPE_INT, - ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_TITLE_OPTION, &opt_title, - "Basic title for new track(s)", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_FIX_OPTION, &opt_fix, - "Synthesize GPS fixes (PPS, DGPS, 3D, 2D, NONE)", nullptr, - ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_COURSE_OPTION, &opt_course, "Synthesize course", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_SPEED_OPTION, &opt_speed, "Synthesize speed", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_SEG2TRK_OPTION, &opt_seg2trk, - "Split track at segment boundaries into multiple tracks", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_TRK2SEG_OPTION, &opt_trk2seg, - "Merge tracks inserting segment separators at boundaries", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_SEGMENT_OPTION, &opt_segment, - "segment tracks with abnormally long gaps", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_FAKETIME_OPTION, &opt_faketime, - "Add specified timestamp to each trackpoint", - nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_DISCARD_OPTION, &opt_discard, - "Discard track points without timestamps during merge", - nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - TRACKFILTER_MINPOINTS_OPTION, &opt_minpoints, - "Discard tracks with fewer than these points", - nullptr, ARGTYPE_INT, "0", "50", nullptr - }, - ARG_TERMINATOR -}; - - -typedef struct trkflt_s { - route_head* track; - QDateTime first_time; - QDateTime last_time; -} trkflt_t; - -static trkflt_t* track_list = nullptr; -static int track_ct = 0; -static int track_pts = 0; -static int timeless_pts = 0; -static int opt_interval = 0; -static int opt_distance = 0; -static char need_time; /* initialized within trackfilter_init */ - /******************************************************************************* * helpers *******************************************************************************/ -static int -trackfilter_opt_count() +int TrackFilter::trackfilter_opt_count() { int res = 0; - arglist_t* a = trackfilter_args; + arglist_t* a = args; while (a->argstring) { if (*a->argval != nullptr) { @@ -200,8 +56,7 @@ trackfilter_opt_count() return res; } -static int -trackfilter_parse_time_opt(const char* arg) +int TrackFilter::trackfilter_parse_time_opt(const char* arg) { time_t t0, t1; int sign = 1; @@ -247,8 +102,7 @@ trackfilter_parse_time_opt(const char* arg) return t0; } -static int -trackfilter_init_qsort_cb(const void* a, const void* b) +int TrackFilter::trackfilter_init_qsort_cb(const void* a, const void* b) { const trkflt_t* ra = (const trkflt_t*) a; const trkflt_t* rb = (const trkflt_t*) b; @@ -264,8 +118,7 @@ trackfilter_init_qsort_cb(const void* a, const void* b) return -1; } -static int -trackfilter_merge_qsort_cb(const void* a, const void* b) +int TrackFilter::trackfilter_merge_qsort_cb(const void* a, const void* b) { const Waypoint* wa = *(Waypoint**)a; const Waypoint* wb = *(Waypoint**)b; @@ -289,8 +142,7 @@ trackfilter_merge_qsort_cb(const void* a, const void* b) return -1; } -static fix_type -trackfilter_parse_fix(int* nsats) +fix_type TrackFilter::trackfilter_parse_fix(int* nsats) { if (!opt_fix) { return fix_unknown; @@ -319,8 +171,7 @@ trackfilter_parse_fix(int* nsats) return fix_unknown; } -static void -trackfilter_fill_track_list_cb(const route_head* track) /* callback for track_disp_all */ +void TrackFilter::trackfilter_fill_track_list_cb(const route_head* track) /* callback for track_disp_all */ { int i; Waypoint* wpt, *prev; @@ -379,8 +230,7 @@ trackfilter_fill_track_list_cb(const route_head* track) /* callback for track_d track_ct++; } -static void -trackfilter_minpoint_list_cb(const route_head* track) +void TrackFilter::trackfilter_minpoint_list_cb(const route_head* track) { int minimum_points = atoi(opt_minpoints); if (track->rte_waypt_ct < minimum_points) { @@ -393,8 +243,7 @@ trackfilter_minpoint_list_cb(const route_head* track) * track title producers *******************************************************************************/ -static void -trackfilter_split_init_rte_name(route_head* track, const QDateTime& dt) +void TrackFilter::trackfilter_split_init_rte_name(route_head* track, const QDateTime& dt) { QString datetimestring; @@ -424,8 +273,7 @@ trackfilter_split_init_rte_name(route_head* track, const QDateTime& dt) } } -static void -trackfilter_pack_init_rte_name(route_head* track, const time_t default_time) +void TrackFilter::trackfilter_pack_init_rte_name(route_head* track, const time_t default_time) { if (strchr(opt_title, '%') != nullptr) { struct tm tm; @@ -450,8 +298,7 @@ trackfilter_pack_init_rte_name(route_head* track, const time_t default_time) * option "title" *******************************************************************************/ -static void -trackfilter_title() +void TrackFilter::trackfilter_title() { int i; @@ -472,8 +319,7 @@ trackfilter_title() * option "pack" (default) *******************************************************************************/ -static void -trackfilter_pack() +void TrackFilter::trackfilter_pack() { int i, j; trkflt_t prev; @@ -511,8 +357,7 @@ trackfilter_pack() * option "merge" *******************************************************************************/ -static void -trackfilter_merge() +void TrackFilter::trackfilter_merge() { int i, j, dropped; @@ -580,8 +425,7 @@ trackfilter_merge() * option "split" *******************************************************************************/ -static void -trackfilter_split() +void TrackFilter::trackfilter_split() { route_head* curr; route_head* master = track_list[0].track; @@ -781,8 +625,7 @@ trackfilter_split() * option "move" *******************************************************************************/ -static void -trackfilter_move() +void TrackFilter::trackfilter_move() { int i; queue* elem, *tmp; @@ -810,8 +653,7 @@ trackfilter_move() * options "fix", "course", "speed" *******************************************************************************/ -static void -trackfilter_synth() +void TrackFilter::trackfilter_synth() { int i; queue* elem, *tmp; @@ -894,8 +736,7 @@ trackfilter_synth() * option: "start" / "stop" *******************************************************************************/ -static time_t -trackfilter_range_check(const char* timestr) +time_t TrackFilter::trackfilter_range_check(const char* timestr) { int i; char fmt[20]; @@ -925,8 +766,7 @@ trackfilter_range_check(const char* timestr) return mkgmtime(&time); } -static int -trackfilter_range() /* returns number of track points left after filtering */ +int TrackFilter::trackfilter_range() /* returns number of track points left after filtering */ { time_t start, stop; queue* elem, *tmp; @@ -984,8 +824,7 @@ trackfilter_range() /* returns number of track points left after filtering */ * option "seg2trk" *******************************************************************************/ -static void -trackfilter_seg2trk() +void TrackFilter::trackfilter_seg2trk() { int i; @@ -1034,8 +873,7 @@ trackfilter_seg2trk() * option "trk2seg" *******************************************************************************/ -static void -trackfilter_trk2seg() +void TrackFilter::trackfilter_trk2seg() { int i, first; route_head* master; @@ -1071,14 +909,7 @@ trackfilter_trk2seg() * option: "faketime" *******************************************************************************/ -typedef struct faketime_s { - time_t start; - int step; - int force; -} faketime_t; - -static faketime_t -trackfilter_faketime_check(const char* timestr) +TrackFilter::faketime_t TrackFilter::trackfilter_faketime_check(const char* timestr) { int i, j; char fmtstart[20]; @@ -1134,8 +965,7 @@ trackfilter_faketime_check(const char* timestr) return result; } -static int -trackfilter_faketime() /* returns number of track points left after filtering */ +int TrackFilter::trackfilter_faketime() /* returns number of track points left after filtering */ { faketime_t faketime; @@ -1164,8 +994,7 @@ trackfilter_faketime() /* returns number of track points left after return track_pts - dropped; } -static int -trackfilter_points_are_same(const Waypoint* wpta, const Waypoint* wptb) +int TrackFilter::trackfilter_points_are_same(const Waypoint* wpta, const Waypoint* wptb) { // We use a simpler (non great circle) test for lat/lon here as this // is used for keeping the 'bookends' of non-moving points. @@ -1188,8 +1017,7 @@ trackfilter_points_are_same(const Waypoint* wpta, const Waypoint* wptb) (wpta->temperature == wptb->temperature); } -static void -trackfilter_segment_head(const route_head* rte) +void TrackFilter::trackfilter_segment_head(const route_head* rte) { queue* elem, *tmp; double avg_dist = 0; @@ -1237,9 +1065,10 @@ trackfilter_segment_head(const route_head* rte) * global cb's *******************************************************************************/ -static void -trackfilter_init(const char*) +void TrackFilter::init() { + RteHdFunctor trackfilter_segment_head_f(this, &TrackFilter::trackfilter_segment_head); + RteHdFunctor trackfilter_fill_track_list_cb_f(this, &TrackFilter::trackfilter_fill_track_list_cb); int count = track_count(); @@ -1265,7 +1094,7 @@ trackfilter_init(const char*) // Perform segmenting first. if (opt_segment) { - track_disp_all(trackfilter_segment_head, nullptr, nullptr); + track_disp_all(trackfilter_segment_head_f, nullptr, nullptr); } if (count > 0) { @@ -1273,15 +1102,14 @@ trackfilter_init(const char*) /* check all tracks for time and order (except merging) */ - track_disp_all(trackfilter_fill_track_list_cb, nullptr, nullptr); + track_disp_all(trackfilter_fill_track_list_cb_f, nullptr, nullptr); if (need_time) { qsort(track_list, track_ct, sizeof(*track_list), trackfilter_init_qsort_cb); } } } -static void -trackfilter_deinit() +void TrackFilter::deinit() { delete[] track_list; track_ct = 0; @@ -1292,9 +1120,10 @@ trackfilter_deinit() * trackfilter_process: called from gpsbabel central engine *******************************************************************************/ -static void -trackfilter_process() +void TrackFilter::process() { + RteHdFunctor trackfilter_minpoint_list_cb_f(this, &TrackFilter::trackfilter_minpoint_list_cb); + int opts, something_done; if (track_ct == 0) { @@ -1344,8 +1173,8 @@ trackfilter_process() return; } - trackfilter_deinit(); /* reinitialize */ - trackfilter_init(nullptr); + deinit(); /* reinitialize */ + init(); if (track_ct == 0) { return; /* no more track(s), no more fun */ @@ -1366,8 +1195,8 @@ trackfilter_process() return; } - trackfilter_deinit(); /* reinitialize */ - trackfilter_init(nullptr); + deinit(); /* reinitialize */ + init(); if (track_ct == 0) { return; /* no more track(s), no more fun */ @@ -1381,8 +1210,8 @@ trackfilter_process() return; } - trackfilter_deinit(); /* reinitialize */ - trackfilter_init(nullptr); + deinit(); /* reinitialize */ + init(); } if (opt_trk2seg != nullptr) { @@ -1426,19 +1255,8 @@ trackfilter_process() // Performed last as previous options may have created "small" tracks. if ((opt_minpoints != nullptr) && atoi(opt_minpoints) > 0) { - track_disp_all(trackfilter_minpoint_list_cb, nullptr, nullptr); + track_disp_all(trackfilter_minpoint_list_cb_f, nullptr, nullptr); } } -/******************************************************************************************/ - -filter_vecs_t trackfilter_vecs = { - trackfilter_init, - trackfilter_process, - trackfilter_deinit, - nullptr, - trackfilter_args -}; - -/******************************************************************************************/ #endif // FILTERS_ENABLED diff --git a/trackfilter.h b/trackfilter.h new file mode 100644 index 000000000..99a6c88b3 --- /dev/null +++ b/trackfilter.h @@ -0,0 +1,231 @@ +/* + + Track manipulation filter + Copyright (c) 2009 - 2013 Robert Lipe, robertlipe+source@gpsbabel.org + Copyright (C) 2005-2006 Olaf Klein, o.b.klein@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ +#ifndef TRACKFILTER_H_INCLUDED_ +#define TRACKFILTER_H_INCLUDED_ + +#include // for QDateTime +#include // for time_t +#include "defs.h" // for ARG_NOMINMAX, route_head (ptr only), ARG... +#include "filter.h" // for Filter + +#if FILTERS_ENABLED || MINIMAL_FILTERS + +#define TRACKFILTER_PACK_OPTION "pack" +#define TRACKFILTER_SPLIT_OPTION "split" +#define TRACKFILTER_SDIST_OPTION "sdistance" +#define TRACKFILTER_TITLE_OPTION "title" +#define TRACKFILTER_MERGE_OPTION "merge" +#define TRACKFILTER_NAME_OPTION "name" +#define TRACKFILTER_STOP_OPTION "stop" +#define TRACKFILTER_START_OPTION "start" +#define TRACKFILTER_MOVE_OPTION "move" +#define TRACKFILTER_FIX_OPTION "fix" +#define TRACKFILTER_COURSE_OPTION "course" +#define TRACKFILTER_SPEED_OPTION "speed" +#define TRACKFILTER_SEG2TRK_OPTION "seg2trk" +#define TRACKFILTER_TRK2SEG_OPTION "trk2seg" +#define TRACKFILTER_SEGMENT_OPTION "segment" +#define TRACKFILTER_FAKETIME_OPTION "faketime" +#define TRACKFILTER_DISCARD_OPTION "discard" +#define TRACKFILTER_MINPOINTS_OPTION "minimum_points" + +class TrackFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void init() override; + void process() override; + void deinit() override; + +private: + char* opt_merge = nullptr; + char* opt_pack = nullptr; + char* opt_split = nullptr; + char* opt_sdistance = nullptr; + char* opt_move = nullptr; + char* opt_title = nullptr; + char* opt_start = nullptr; + char* opt_stop = nullptr; + char* opt_fix = nullptr; + char* opt_course = nullptr; + char* opt_speed = nullptr; + char* opt_name = nullptr; + char* opt_seg2trk = nullptr; + char* opt_trk2seg = nullptr; + char* opt_segment = nullptr; + char* opt_faketime = nullptr; + char* opt_discard = nullptr; + char* opt_minpoints = nullptr; + + arglist_t args[19] = { + { + TRACKFILTER_MOVE_OPTION, &opt_move, + "Correct trackpoint timestamps by a delta", nullptr, ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_PACK_OPTION, &opt_pack, + "Pack all tracks into one", nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_SPLIT_OPTION, &opt_split, + "Split by date or time interval (see README)", nullptr, + ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_SDIST_OPTION, &opt_sdistance, + "Split by distance", nullptr, + ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_MERGE_OPTION, &opt_merge, + "Merge multiple tracks for the same way", nullptr, ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_NAME_OPTION, &opt_name, + "Use only track(s) where title matches given name", nullptr, ARGTYPE_STRING, + ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_START_OPTION, &opt_start, + "Use only track points after this timestamp", nullptr, ARGTYPE_INT, + ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_STOP_OPTION, &opt_stop, + "Use only track points before this timestamp", nullptr, ARGTYPE_INT, + ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_TITLE_OPTION, &opt_title, + "Basic title for new track(s)", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_FIX_OPTION, &opt_fix, + "Synthesize GPS fixes (PPS, DGPS, 3D, 2D, NONE)", nullptr, + ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_COURSE_OPTION, &opt_course, "Synthesize course", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_SPEED_OPTION, &opt_speed, "Synthesize speed", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_SEG2TRK_OPTION, &opt_seg2trk, + "Split track at segment boundaries into multiple tracks", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_TRK2SEG_OPTION, &opt_trk2seg, + "Merge tracks inserting segment separators at boundaries", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_SEGMENT_OPTION, &opt_segment, + "segment tracks with abnormally long gaps", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_FAKETIME_OPTION, &opt_faketime, + "Add specified timestamp to each trackpoint", + nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_DISCARD_OPTION, &opt_discard, + "Discard track points without timestamps during merge", + nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + TRACKFILTER_MINPOINTS_OPTION, &opt_minpoints, + "Discard tracks with fewer than these points", + nullptr, ARGTYPE_INT, "0", "50", nullptr + }, + ARG_TERMINATOR + }; + + typedef struct trkflt_s { + route_head* track; + QDateTime first_time; + QDateTime last_time; + } trkflt_t; + + trkflt_t* track_list = nullptr; + int track_ct = 0; + int track_pts = 0; + int timeless_pts = 0; + int opt_interval = 0; + int opt_distance = 0; + char need_time; /* initialized within trackfilter_init */ + + int trackfilter_opt_count(); + int trackfilter_parse_time_opt(const char* arg); + static int trackfilter_init_qsort_cb(const void* a, const void* b); + static int trackfilter_merge_qsort_cb(const void* a, const void* b); + fix_type trackfilter_parse_fix(int* nsats); + void trackfilter_fill_track_list_cb(const route_head* track); /* callback for track_disp_all */ + void trackfilter_minpoint_list_cb(const route_head* track); + + void trackfilter_split_init_rte_name(route_head* track, const QDateTime& dt); + void trackfilter_pack_init_rte_name(route_head* track, const time_t default_time); + + void trackfilter_title(); + + void trackfilter_pack(); + + void trackfilter_merge(); + + void trackfilter_split(); + + void trackfilter_move(); + + void trackfilter_synth(); + + time_t trackfilter_range_check(const char* timestr); + int trackfilter_range(); /* returns number of track points left after filtering */ + + void trackfilter_seg2trk(); + + void trackfilter_trk2seg(); + + typedef struct faketime_s { + time_t start; + int step; + int force; + } faketime_t; + + faketime_t trackfilter_faketime_check(const char* timestr); + int trackfilter_faketime(); /* returns number of track points left after filtering */ + int trackfilter_points_are_same(const Waypoint* wpta, const Waypoint* wptb); + + void trackfilter_segment_head(const route_head* rte); + +}; + +#endif // FILTERS_ENABLED +#endif // TRACKFILTER_H_INCLUDED_ diff --git a/transform.cc b/transform.cc index 08ce43a29..98ddb4e7b 100644 --- a/transform.cc +++ b/transform.cc @@ -22,6 +22,7 @@ #include "defs.h" #include "filterdefs.h" +#include "transform.h" #include #if FILTERS_ENABLED @@ -30,48 +31,7 @@ #define MYNAME "transform" -static char current_target; -static route_head* current_trk; -static route_head* current_rte; - -static char* opt_routes, *opt_tracks, *opt_waypts, *opt_delete, *rpt_name_digits, *opt_rpt_name; -static QString current_namepart; - -static int name_digits, use_src_name; - -static char RPT[] = "RPT"; - -static -arglist_t transform_args[] = { - { - "wpt", &opt_waypts, "Transform track(s) or route(s) into waypoint(s) [R/T]", nullptr, - ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - "rte", &opt_routes, "Transform waypoint(s) or track(s) into route(s) [W/T]", nullptr, - ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - "trk", &opt_tracks, "Transform waypoint(s) or route(s) into tracks(s) [W/R]", nullptr, - ARGTYPE_STRING, ARG_NOMINMAX, nullptr - }, - { - "rptdigits", &rpt_name_digits, "Number of digits in generated names", nullptr, - ARGTYPE_INT, "2", nullptr, nullptr - }, - { - "rptname", &opt_rpt_name, "Use source name for route point names", "N", - ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - { - "del", &opt_delete, "Delete source data after transformation", "N", - ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, - ARG_TERMINATOR -}; - -static void -transform_waypoints() +void TransformFilter::transform_waypoints() { route_head* rte; @@ -85,7 +45,7 @@ transform_waypoints() break; } #if NEWQ - foreach(Waypoint* wpt, waypt_list) { + foreach (Waypoint* wpt, waypt_list) { #else queue* elem, *tmp; QUEUE_FOR_EACH(&waypt_head, elem, tmp) { @@ -104,8 +64,7 @@ transform_waypoints() } } -static void -transform_rte_disp_hdr_cb(const route_head* rte) +void TransformFilter::transform_rte_disp_hdr_cb(const route_head* rte) { current_namepart = RPT; if (!rte->rte_name.isEmpty() && use_src_name) { @@ -121,8 +80,7 @@ transform_rte_disp_hdr_cb(const route_head* rte) } } -static void -transform_trk_disp_hdr_cb(const route_head* trk) +void TransformFilter::transform_trk_disp_hdr_cb(const route_head* trk) { current_namepart = RPT; if (!trk->rte_name.isEmpty() && use_src_name) { @@ -139,8 +97,7 @@ transform_trk_disp_hdr_cb(const route_head* trk) } } -static void -transform_any_disp_wpt_cb(const Waypoint* wpt) +void TransformFilter::transform_any_disp_wpt_cb(const Waypoint* wpt) { Waypoint* temp = new Waypoint(*wpt); if (current_target == 'R') { @@ -152,34 +109,27 @@ transform_any_disp_wpt_cb(const Waypoint* wpt) } } -static void -transform_routes() +void TransformFilter::transform_routes() { - route_disp_all(transform_rte_disp_hdr_cb, nullptr, transform_any_disp_wpt_cb); + WayptFunctor transform_any_disp_wpt_cb_f(this, &TransformFilter::transform_any_disp_wpt_cb); + RteHdFunctor transform_rte_disp_hdr_cb_f(this, &TransformFilter::transform_rte_disp_hdr_cb); + + route_disp_all(transform_rte_disp_hdr_cb_f, nullptr, transform_any_disp_wpt_cb_f); } -static void -transform_tracks() +void TransformFilter::transform_tracks() { - track_disp_all(transform_trk_disp_hdr_cb, nullptr, transform_any_disp_wpt_cb); + WayptFunctor transform_any_disp_wpt_cb_f(this, &TransformFilter::transform_any_disp_wpt_cb); + RteHdFunctor transform_trk_disp_hdr_cb_f(this, &TransformFilter::transform_trk_disp_hdr_cb); + + track_disp_all(transform_trk_disp_hdr_cb_f, nullptr, transform_any_disp_wpt_cb_f); } /******************************************************************************* * %%% global callbacks called by gpsbabel main process %%% * *******************************************************************************/ -static void -transform_init(const char*) -{ -} - -static void -transform_deinit() -{ -} - -static void -transform_process() +void TransformFilter::process() { int delete_after = (opt_delete && (*opt_delete == '1')) ? 1 : 0; @@ -249,16 +199,4 @@ transform_process() } } -/*******************************************************************************/ - -filter_vecs_t transform_vecs = { - transform_init, - transform_process, - transform_deinit, - nullptr, - transform_args -}; - -/*******************************************************************************/ - #endif // FILTERS_ENABLED diff --git a/transform.h b/transform.h new file mode 100644 index 000000000..9ffe13462 --- /dev/null +++ b/transform.h @@ -0,0 +1,91 @@ +/* + + Transformation filter for GPS data. + + Copyright (C) 2006 Olaf Klein, o.b.klein@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#ifndef TRANSFORM_H_INCLUDED_ +#define TRANSFORM_H_INCLUDED_ + +#include // for QString +#include "defs.h" // for route_head (ptr only), ARG_NOMINMAX, ARGTY... +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class TransformFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void process() override; + +private: + char current_target; + route_head* current_trk; + route_head* current_rte; + + char* opt_routes, *opt_tracks, *opt_waypts, *opt_delete, *rpt_name_digits, *opt_rpt_name; + QString current_namepart; + + int name_digits, use_src_name; + + const QString RPT = "RPT"; + + arglist_t args[7] = { + { + "wpt", &opt_waypts, "Transform track(s) or route(s) into waypoint(s) [R/T]", nullptr, + ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + "rte", &opt_routes, "Transform waypoint(s) or track(s) into route(s) [W/T]", nullptr, + ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + "trk", &opt_tracks, "Transform waypoint(s) or route(s) into tracks(s) [W/R]", nullptr, + ARGTYPE_STRING, ARG_NOMINMAX, nullptr + }, + { + "rptdigits", &rpt_name_digits, "Number of digits in generated names", nullptr, + ARGTYPE_INT, "2", nullptr, nullptr + }, + { + "rptname", &opt_rpt_name, "Use source name for route point names", "N", + ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "del", &opt_delete, "Delete source data after transformation", "N", + ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + void transform_waypoints(); + void transform_rte_disp_hdr_cb(const route_head* rte); + void transform_trk_disp_hdr_cb(const route_head* trk); + void transform_any_disp_wpt_cb(const Waypoint* wpt); + void transform_routes(); + void transform_tracks(); + +}; + +#endif // FILTERS_ENABLED +#endif // TRANSFORM_H_INCLUDED_ diff --git a/validate.cc b/validate.cc index 8d5d9a4c7..9b449dc93 100644 --- a/validate.cc +++ b/validate.cc @@ -22,41 +22,19 @@ #include "defs.h" #include "filterdefs.h" +#include "validate.h" #include #if FILTERS_ENABLED #define MYNAME "validate" -static char* opt_debug; -static bool debug; -static char* opt_checkempty; -static bool checkempty; -static unsigned int point_ct; -static unsigned int head_ct; -static unsigned int segment_ct_start; -static const char* segment_type; - -static -arglist_t validate_args[] = { - { - "checkempty", &opt_checkempty, "Check for empty input", - "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - } , - { - "debug", &opt_debug, "Output debug messages instead of possibly issuing a fatal error", - "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - } , - ARG_TERMINATOR -}; - - -static void validate_head(const route_head*) +void ValidateFilter::validate_head(const route_head*) { head_ct += 1; segment_ct_start = point_ct; } -static void validate_head_trl(const route_head* header) +void ValidateFilter::validate_head_trl(const route_head* header) { int segment_waypt_ct = point_ct - segment_ct_start; if (debug) { @@ -67,14 +45,16 @@ static void validate_head_trl(const route_head* header) } } -static void validate_point(const Waypoint*) +void ValidateFilter::validate_point(const Waypoint*) { point_ct += 1; } -static void -validate_process() +void ValidateFilter::process() { + WayptFunctor validate_point_f(this, &ValidateFilter::validate_point); + RteHdFunctor validate_head_f(this, &ValidateFilter::validate_head); + RteHdFunctor validate_head_trl_f(this, &ValidateFilter::validate_head_trl); debug = *opt_debug == '1'; checkempty = *opt_checkempty == '1'; @@ -83,7 +63,7 @@ validate_process() if (debug) { fprintf(stderr, "\nProcessing waypts\n"); } - waypt_disp_all(validate_point); + waypt_disp_all(validate_point_f); if (debug) { fprintf(stderr, "point ct: %u, waypt_count: %u\n", point_ct, waypt_count()); } @@ -97,7 +77,7 @@ validate_process() if (debug) { fprintf(stderr, "\nProcessing routes\n"); } - route_disp_all(validate_head, validate_head_trl, validate_point); + route_disp_all(validate_head_f, validate_head_trl_f, validate_point_f); if (debug) { fprintf(stderr, "route head ct: %u, route_count: %u\n", head_ct, route_count()); fprintf(stderr, "total route point ct: %u, route_waypt_count: %u\n", point_ct, route_waypt_count()); @@ -115,7 +95,7 @@ validate_process() if (debug) { fprintf(stderr, "\nProcessing tracks\n"); } - track_disp_all(validate_head, validate_head_trl, validate_point); + track_disp_all(validate_head_f, validate_head_trl_f, validate_point_f); if (debug) { fprintf(stderr, "track head ct: %u, track_count: %u\n", head_ct, track_count()); fprintf(stderr, "total track point ct: %u, track_waypt_count: %u\n", point_ct, track_waypt_count()); @@ -134,12 +114,4 @@ validate_process() } } -filter_vecs_t validate_vecs = { - nullptr, - validate_process, - nullptr, - nullptr, - validate_args -}; - #endif diff --git a/validate.h b/validate.h new file mode 100644 index 000000000..6932ad679 --- /dev/null +++ b/validate.h @@ -0,0 +1,68 @@ +/* + + validate internal data structures. + + Copyright (C) 2013 Robert Lipe robertlipe+source@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + +*/ + +#ifndef VALIDATE_H_INCLUDED_ +#define VALIDATE_H_INCLUDED_ + +#include "defs.h" // for route_head (ptr only), ARGTYPE_BOOL, ARG_NOMINMAX +#include "filter.h" // for Filter + +#if FILTERS_ENABLED + +class ValidateFilter:public Filter +{ +public: + arglist_t* get_args() override + { + return args; + } + void process() override; + +private: + char* opt_debug; + bool debug; + char* opt_checkempty; + bool checkempty; + unsigned int point_ct; + unsigned int head_ct; + unsigned int segment_ct_start; + const char* segment_type; + arglist_t args[3] = { + { + "checkempty", &opt_checkempty, "Check for empty input", + "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + { + "debug", &opt_debug, "Output debug messages instead of possibly issuing a fatal error", + "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, + ARG_TERMINATOR + }; + + void validate_head(const route_head*); + void validate_head_trl(const route_head* header); + void validate_point(const Waypoint*); + +}; + +#endif +#endif // VALIDATE_H_INCLUDED_ diff --git a/waypt.cc b/waypt.cc index 0983620c6..7fb2dd4c2 100644 --- a/waypt.cc +++ b/waypt.cc @@ -198,37 +198,6 @@ waypt_status_disp(int total_ct, int myct) fflush(stdout); } -void -waypt_disp_all(waypt_cb cb) -{ - waypt_disp_session(nullptr, cb); -} - -void -waypt_disp_session(const session_t* se, waypt_cb cb) -{ - int i = 0; -#if NEWQ - foreach(Waypoint* waypointp, waypt_list) { -#else - queue* elem, *tmp; - Waypoint* waypointp; - QUEUE_FOR_EACH(&waypt_head, elem, tmp) { - waypointp = (Waypoint*) elem; -#endif - if ((se == nullptr) || (waypointp->session == se)) { - if (global_opts.verbose_status) { - i++; - waypt_status_disp(waypt_count(), i); - } - (*cb)(waypointp); - } - } - if (global_opts.verbose_status) { - fprintf(stdout, "\r\n"); - } -} - void waypt_init_bounds(bounds* bounds) { -- 2.30.2